Revision c834348d
Added by Leszek Koltunski almost 8 years ago
src/main/java/org/distorted/library/DistortedNode.java | ||
---|---|---|
44 | 44 |
private MeshObject mMesh; |
45 | 45 |
private DistortedEffects mEffects; |
46 | 46 |
private DistortedInputSurface mSurface; |
47 |
private DistortedRenderState mState; |
|
47 | 48 |
private NodeData mData; |
48 | 49 |
|
49 | 50 |
private ArrayList<DistortedNode> mChildren; |
... | ... | |
227 | 228 |
if( input.setAsInput() ) |
228 | 229 |
{ |
229 | 230 |
ret++; |
231 |
mState.apply(); |
|
230 | 232 |
mEffects.drawPriv(halfX, halfY, mMesh, surface, currTime); |
231 | 233 |
} |
232 | 234 |
|
... | ... | |
248 | 250 |
mSurface = surface; |
249 | 251 |
mEffects = effects; |
250 | 252 |
mMesh = mesh; |
253 |
mState = new DistortedRenderState(); |
|
251 | 254 |
mChildren = null; |
252 | 255 |
mNumChildren = new int[1]; |
253 | 256 |
mNumChildren[0]= 0; |
... | ... | |
284 | 287 |
{ |
285 | 288 |
mEffects= new DistortedEffects(node.mEffects,flags); |
286 | 289 |
mMesh = node.mMesh; |
290 |
mState = new DistortedRenderState(); |
|
287 | 291 |
mParent = null; |
288 | 292 |
|
289 | 293 |
if( (flags & Distorted.CLONE_SURFACE) != 0 ) |
... | ... | |
521 | 525 |
return mData.mFBO; |
522 | 526 |
} |
523 | 527 |
|
528 |
|
|
529 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
530 |
/** |
|
531 |
* When rendering this Node, use ColorMask (r,g,b,a). |
|
532 |
* |
|
533 |
* @param r Write to the RED color channel when rendering this Node? |
|
534 |
* @param g Write to the GREEN color channel when rendering this Node? |
|
535 |
* @param b Write to the BLUE color channel when rendering this Node? |
|
536 |
* @param a Write to the ALPHA channel when rendering this Node? |
|
537 |
*/ |
|
538 |
public void glColorMask(boolean r, boolean g, boolean b, boolean a) |
|
539 |
{ |
|
540 |
mState.glColorMask(r,g,b,a); |
|
541 |
} |
|
542 |
|
|
543 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
544 |
/** |
|
545 |
* When rendering this Node, switch on writing to Depth buffer? |
|
546 |
* |
|
547 |
* @param mask Write to the Depth buffer when rendering this Node? |
|
548 |
*/ |
|
549 |
public void glDepthMask(boolean mask) |
|
550 |
{ |
|
551 |
mState.glDepthMask(mask); |
|
552 |
} |
|
553 |
|
|
554 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
555 |
/** |
|
556 |
* When rendering this Node, which bits of the Stencil buffer to write to? |
|
557 |
* |
|
558 |
* @param mask Marks the bits of the Stencil buffer we will write to when rendering this Node. |
|
559 |
*/ |
|
560 |
public void glStencilMask(int mask) |
|
561 |
{ |
|
562 |
mState.glStencilMask(mask); |
|
563 |
} |
|
564 |
|
|
565 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
566 |
/** |
|
567 |
* When rendering this Node, which Tests to enable? |
|
568 |
* |
|
569 |
* @param test Valid values: GL_DEPTH_TEST, GL_STENCIL_TEST, GL_BLEND |
|
570 |
*/ |
|
571 |
public void glEnable(int test) |
|
572 |
{ |
|
573 |
mState.glEnable(test); |
|
574 |
} |
|
575 |
|
|
576 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
577 |
/** |
|
578 |
* When rendering this Node, which Tests to enable? |
|
579 |
* |
|
580 |
* @param test Valid values: GL_DEPTH_TEST, GL_STENCIL_TEST, GL_BLEND |
|
581 |
*/ |
|
582 |
public void glDisable(int test) |
|
583 |
{ |
|
584 |
mState.glDisable(test); |
|
585 |
} |
|
586 |
|
|
587 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
588 |
/** |
|
589 |
* When rendering this Node, use the following StencilFunc. |
|
590 |
* |
|
591 |
* @param func Valid values: GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL |
|
592 |
* @param ref Reference valut to compare our stencil with. |
|
593 |
* @param mask Mask used when comparing. |
|
594 |
*/ |
|
595 |
public void glStencilFunc(int func, int ref, int mask) |
|
596 |
{ |
|
597 |
mState.glStencilFunc(func,ref,mask); |
|
598 |
} |
|
599 |
|
|
600 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
601 |
/** |
|
602 |
* When rendering this Node, use the following StencilOp. |
|
603 |
* <p> |
|
604 |
* Valid values of all 3 parameters: GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP |
|
605 |
* |
|
606 |
* @param sfail What to do when Stencil Test fails. |
|
607 |
* @param dpfail What to do when Depth Test fails. |
|
608 |
* @param dppass What to do when Depth Test passes. |
|
609 |
*/ |
|
610 |
public void glStencilOp(int sfail, int dpfail, int dppass) |
|
611 |
{ |
|
612 |
mState.glStencilOp(sfail,dpfail,dppass); |
|
613 |
} |
|
614 |
|
|
615 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
616 |
/** |
|
617 |
* When rendering this Node, use the following DepthFunc. |
|
618 |
* |
|
619 |
* @param func Valid values: GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL |
|
620 |
*/ |
|
621 |
public void glDepthFunc(int func) |
|
622 |
{ |
|
623 |
mState.glDepthFunc(func); |
|
624 |
} |
|
625 |
|
|
626 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
627 |
/** |
|
628 |
* When rendering this Node, use the following Blending mode. |
|
629 |
* <p> |
|
630 |
* Valid values: GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, |
|
631 |
* GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, |
|
632 |
* GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA, GL_SRC_ALPHA_SATURATE |
|
633 |
* |
|
634 |
* @param src Source Blend function |
|
635 |
* @param dst Destination Blend function |
|
636 |
*/ |
|
637 |
public void glBlendFunc(int src, int dst) |
|
638 |
{ |
|
639 |
mState.glBlendFunc(src,dst); |
|
640 |
} |
|
524 | 641 |
} |
src/main/java/org/distorted/library/DistortedOutputSurface.java | ||
---|---|---|
143 | 143 |
DistortedSurface.debugLists(); |
144 | 144 |
} |
145 | 145 |
*/ |
146 |
GLES30.glEnable(GLES30.GL_BLEND);
|
|
147 |
GLES30.glBlendFunc(GLES30.GL_SRC_ALPHA, GLES30.GL_ONE_MINUS_SRC_ALPHA);
|
|
146 |
// mark OpenGL state as unknown
|
|
147 |
DistortedRenderState.reset();
|
|
148 | 148 |
|
149 | 149 |
int numRenders = 0; |
150 | 150 |
|
... | ... | |
163 | 163 |
public void setAsOutput() |
164 | 164 |
{ |
165 | 165 |
GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, mFBOH[0]); |
166 |
|
|
167 |
if( mDepthCreated==CREATED ) |
|
168 |
{ |
|
169 |
GLES30.glEnable(GLES30.GL_DEPTH_TEST); |
|
170 |
GLES30.glDepthMask(true); |
|
171 |
} |
|
172 |
else |
|
173 |
{ |
|
174 |
GLES30.glDisable(GLES30.GL_DEPTH_TEST); |
|
175 |
GLES30.glDepthMask(false); |
|
176 |
} |
|
177 | 166 |
} |
178 | 167 |
|
179 | 168 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/library/DistortedRenderState.java | ||
---|---|---|
35 | 35 |
private static int sStencilFuncFunc, sStencilFuncRef, sStencilFuncMask; |
36 | 36 |
private static int sStencilOpSfail, sStencilOpDpfail, sStencilOpDppass; |
37 | 37 |
private static int sDepthFunc; |
38 |
private static int sBlend; |
|
39 |
private static int sBlendSrc, sBlendDst; |
|
38 | 40 |
|
39 | 41 |
private int mColorMaskR, mColorMaskG, mColorMaskB, mColorMaskA; |
40 | 42 |
private int mDepthMask; |
... | ... | |
44 | 46 |
private int mStencilFuncFunc, mStencilFuncRef, mStencilFuncMask; |
45 | 47 |
private int mStencilOpSfail, mStencilOpDpfail, mStencilOpDppass; |
46 | 48 |
private int mDepthFunc; |
49 |
private int mBlend; |
|
50 |
private int mBlendSrc, mBlendDst; |
|
47 | 51 |
|
48 | 52 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
53 |
// default: color writes on, depth test and writes on, blending on, stencil off. |
|
49 | 54 |
|
50 | 55 |
DistortedRenderState() |
51 | 56 |
{ |
... | ... | |
53 | 58 |
mColorMaskG = 1; |
54 | 59 |
mColorMaskB = 1; |
55 | 60 |
mColorMaskA = 1; |
56 |
mDepthMask = 1; |
|
57 |
mStencilMask= 0x11111111; |
|
61 |
|
|
58 | 62 |
mDepthTest = 1; |
59 |
mStencilTest= 0; |
|
63 |
mDepthMask = 1; |
|
64 |
mDepthFunc = GLES30.GL_LEQUAL; |
|
60 | 65 |
|
66 |
mBlend = 1; |
|
67 |
mBlendSrc = GLES30.GL_SRC_ALPHA; |
|
68 |
mBlendDst = GLES30.GL_ONE_MINUS_SRC_ALPHA; |
|
69 |
|
|
70 |
mStencilTest = 0; |
|
71 |
mStencilMask = 0x11111111; |
|
61 | 72 |
mStencilFuncFunc = GLES30.GL_NEVER; |
62 | 73 |
mStencilFuncRef = 0; |
63 | 74 |
mStencilFuncMask = 0x11111111; |
64 | 75 |
mStencilOpSfail = GLES30.GL_KEEP; |
65 | 76 |
mStencilOpDpfail = GLES30.GL_KEEP; |
66 | 77 |
mStencilOpDppass = GLES30.GL_KEEP; |
67 |
mDepthFunc = GLES30.GL_LEQUAL; |
|
68 | 78 |
} |
69 | 79 |
|
70 | 80 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
81 |
// reset state of everything to 'unknown' |
|
71 | 82 |
|
72 | 83 |
static void reset() |
73 | 84 |
{ |
... | ... | |
75 | 86 |
sColorMaskG = -1; |
76 | 87 |
sColorMaskB = -1; |
77 | 88 |
sColorMaskA = -1; |
78 |
sDepthMask = -1; |
|
79 |
sStencilMask= -1; |
|
89 |
|
|
80 | 90 |
sDepthTest = -1; |
81 |
sStencilTest= -1; |
|
91 |
sDepthMask = -1; |
|
92 |
sDepthFunc = -1; |
|
93 |
|
|
94 |
sBlend = -1; |
|
95 |
sBlendSrc = -1; |
|
96 |
sBlendDst = -1; |
|
82 | 97 |
|
98 |
sStencilTest = -1; |
|
99 |
sStencilMask = -1; |
|
83 | 100 |
sStencilFuncFunc = -1; |
84 | 101 |
sStencilFuncRef = -1; |
85 | 102 |
sStencilFuncMask = -1; |
86 | 103 |
sStencilOpSfail = -1; |
87 | 104 |
sStencilOpDpfail = -1; |
88 | 105 |
sStencilOpDppass = -1; |
89 |
sDepthFunc = -1; |
|
90 | 106 |
} |
91 | 107 |
|
92 | 108 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
124 | 140 |
} |
125 | 141 |
} |
126 | 142 |
|
143 |
if( mBlend!=sBlend ) |
|
144 |
{ |
|
145 |
sBlend = mBlend; |
|
146 |
if( sBlend==0 ) GLES30.glDisable(GLES30.GL_BLEND); |
|
147 |
else |
|
148 |
{ |
|
149 |
GLES30.glEnable(GLES30.GL_BLEND); |
|
150 |
|
|
151 |
if( mBlendSrc!=sBlendSrc || mBlendDst!=sBlendDst ) |
|
152 |
{ |
|
153 |
sBlendSrc = mBlendSrc; |
|
154 |
sBlendDst = mBlendDst; |
|
155 |
GLES30.glBlendFunc(sBlendSrc,sBlendDst); |
|
156 |
} |
|
157 |
} |
|
158 |
} |
|
159 |
|
|
127 | 160 |
if( mStencilTest!=sStencilTest ) |
128 | 161 |
{ |
129 | 162 |
sStencilTest = mStencilTest; |
... | ... | |
187 | 220 |
{ |
188 | 221 |
if( test==GLES30.GL_DEPTH_TEST ) mDepthTest = 1; |
189 | 222 |
else if( test==GLES30.GL_STENCIL_TEST ) mStencilTest = 1; |
223 |
else if( test==GLES30.GL_BLEND ) mBlend = 1; |
|
190 | 224 |
} |
191 | 225 |
|
192 | 226 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
195 | 229 |
{ |
196 | 230 |
if( test==GLES30.GL_DEPTH_TEST ) mDepthTest = 0; |
197 | 231 |
else if( test==GLES30.GL_STENCIL_TEST ) mStencilTest = 0; |
232 |
else if( test==GLES30.GL_BLEND ) mBlend = 0; |
|
198 | 233 |
} |
199 | 234 |
|
200 | 235 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
221 | 256 |
{ |
222 | 257 |
mDepthFunc = func; |
223 | 258 |
} |
259 |
|
|
260 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
261 |
|
|
262 |
void glBlendFunc(int src, int dst) |
|
263 |
{ |
|
264 |
mBlendSrc = src; |
|
265 |
mBlendDst = dst; |
|
266 |
} |
|
267 |
|
|
224 | 268 |
} |
Also available in: Unified diff
Make it possible to render each DistortedNode with adjustable OpeGL state (writeing to Color, Depth,Stencil buffers, DEPTH, STENCIL, BLENDING on.off, etc)