Revision 42e08626
Added by Leszek Koltunski about 9 years ago
| src/main/java/org/distorted/library/DistortedObject.java | ||
|---|---|---|
| 567 | 567 |
|
| 568 | 568 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 569 | 569 |
// Fragment-based effects |
| 570 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 571 |
/** |
|
| 572 |
* Creates macroblocks at and around point defined by the Region. |
|
| 573 |
* |
|
| 574 |
* @param size 1-dimensional Dynamic which, at any given time, returns the size of the macroblocks. |
|
| 575 |
* @param region Region this Effect is limited to. |
|
| 576 |
* @return ID of the effect added, or -1 if we failed to add one. |
|
| 577 |
*/ |
|
| 578 |
public long macroblock(Data1D size, Data4D region) |
|
| 579 |
{
|
|
| 580 |
return mF.add(EffectNames.MACROBLOCK, size, region); |
|
| 581 |
} |
|
| 582 |
|
|
| 583 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 584 |
/** |
|
| 585 |
* Creates macroblocks on the whole Object. |
|
| 586 |
* |
|
| 587 |
* @param size 1-dimensional Data which, at any given time, returns the size of the macroblocks. |
|
| 588 |
* @return ID of the effect added, or -1 if we failed to add one. |
|
| 589 |
*/ |
|
| 590 |
public long macroblock(Data1D size) |
|
| 591 |
{
|
|
| 592 |
return mF.add(EffectNames.MACROBLOCK, size); |
|
| 593 |
} |
|
| 594 |
|
|
| 595 | 570 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 596 | 571 |
/** |
| 597 | 572 |
* Makes a certain sub-region of the Object smoothly change all three of its RGB components. |
| src/main/java/org/distorted/library/EffectNames.java | ||
|---|---|---|
| 120 | 120 |
///////////////////////////////////////////////////////////////////////////////// |
| 121 | 121 |
// FRAGMENT EFFECTS |
| 122 | 122 |
// Always 8 Uniforms: 4-per effect interpolated values, 4 dimensional Region. |
| 123 |
/** |
|
| 124 |
* Create square-shaped macroblocks. |
|
| 125 |
* <p> |
|
| 126 |
* Uniforms: (macroblockSize,UNUSED,UNUSED,UNUSED, regionX, regionY, regionRX, regionRY) |
|
| 127 |
* Unity: macroblockSize = 1 |
|
| 128 |
*/ |
|
| 129 |
MACROBLOCK ( EffectTypes.FRAGMENT, new float[] {1.0f} ),
|
|
| 130 | 123 |
/** |
| 131 | 124 |
* Make a given Region (partially) transparent. |
| 132 | 125 |
* <p> |
| src/main/java/org/distorted/library/EffectQueueFragment.java | ||
|---|---|---|
| 141 | 141 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 142 | 142 |
// Do various post-processing on already computed effects. |
| 143 | 143 |
// 1) move all Points and scale all Region radii by a ModelView matrix |
| 144 |
// 2) in case of macroblock, pre-compute some values so that we don't have to do it in the fragment shader. |
|
| 145 |
|
|
| 144 |
|
|
| 146 | 145 |
void postprocess(float[] MVmatrix) |
| 147 | 146 |
{
|
| 148 | 147 |
if( mNumEffects>0 ) |
| ... | ... | |
| 160 | 159 |
mUniforms[NUM_UNIFORMS*i+5] = MVmatrix[1]*tx + MVmatrix[5]*ty + MVmatrix[13]; // |
| 161 | 160 |
mUniforms[NUM_UNIFORMS*i+6] = w*mBuf[4*i+2]; // in fragment shader rx and ry radii are the last two values of the second vec4 |
| 162 | 161 |
mUniforms[NUM_UNIFORMS*i+7] = h*mBuf[4*i+3]; // |
| 163 |
|
|
| 164 |
if( mName[i]==EffectNames.MACROBLOCK.ordinal() ) // fill up the .y and .z components of the Interpolated values already to avoid having to compute this in the fragment shader |
|
| 165 |
{
|
|
| 166 |
mUniforms[NUM_UNIFORMS*i+1] = 2.0f*mObjHalfX/mUniforms[NUM_UNIFORMS*i]; |
|
| 167 |
mUniforms[NUM_UNIFORMS*i+2] = 2.0f*mObjHalfY/mUniforms[NUM_UNIFORMS*i]; |
|
| 168 |
} |
|
| 169 | 162 |
} |
| 170 | 163 |
} |
| 171 | 164 |
} |
| 172 | 165 |
|
| 173 | 166 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 174 |
// macroblock, alpha, brightness, contrast, saturation
|
|
| 167 |
// alpha, brightness, contrast, saturation |
|
| 175 | 168 |
|
| 176 | 169 |
synchronized long add(EffectNames eln, Data1D data) |
| 177 | 170 |
{
|
| ... | ... | |
| 201 | 194 |
} |
| 202 | 195 |
|
| 203 | 196 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 204 |
// macroblock, alpha, brightness, contrast, saturation
|
|
| 197 |
// alpha, brightness, contrast, saturation |
|
| 205 | 198 |
|
| 206 | 199 |
synchronized long add(EffectNames eln, Data1D data, Data4D region) |
| 207 | 200 |
{
|
| src/main/res/raw/main_fragment_shader.glsl | ||
|---|---|---|
| 33 | 33 |
// next describes the Region, i.e. area over which the effect is active. |
| 34 | 34 |
|
| 35 | 35 |
const vec3 LUMI = vec3( 0.2125, 0.7154, 0.0721 ); |
| 36 |
|
|
| 37 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 38 |
// MACROBLOCK EFFECT |
|
| 39 |
|
|
| 40 |
void macroblock(float degree, int effect, inout vec2 tex) |
|
| 41 |
{
|
|
| 42 |
vec2 one = vec2(1.0,1.0); |
|
| 43 |
vec2 a = degree*(fUniforms[effect].yz-one)+one; |
|
| 44 |
tex = ( max((1.0-degree)*tex,floor(tex*a)) + degree*vec2(0.5,0.5) ) / a; |
|
| 45 |
} |
|
| 46 | 36 |
|
| 47 | 37 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| 48 | 38 |
// CHROMA EFFECT |
| ... | ... | |
| 91 | 81 |
|
| 92 | 82 |
void main() |
| 93 | 83 |
{
|
| 94 |
vec2 tex = v_TexCoordinate; |
|
| 95 |
vec4 col = texture2D(u_Texture, tex); |
|
| 84 |
vec4 pixel = texture2D(u_Texture,v_TexCoordinate); |
|
| 96 | 85 |
|
| 97 | 86 |
#if NUM_FRAGMENT>0 |
| 98 | 87 |
vec2 diff; |
| ... | ... | |
| 103 | 92 |
diff = (v_Position.xy - fUniforms[2*i+1].xy)/fUniforms[2*i+1].zw; |
| 104 | 93 |
pointDegree = max(0.0,1.0-dot(diff,diff)); |
| 105 | 94 |
|
| 106 |
if( fType[i]==MACROBLOCK ) macroblock(sign(pointDegree),2*i,tex); |
|
| 107 |
else if( fType[i]==CHROMA ) chroma (sign(pointDegree),2*i,col); |
|
| 108 |
else if( fType[i]==SMOOTH_CHROMA ) chroma ( pointDegree ,2*i,col); |
|
| 109 |
else if( fType[i]==ALPHA ) alpha (sign(pointDegree),2*i,col); |
|
| 110 |
else if( fType[i]==SMOOTH_ALPHA ) alpha ( pointDegree ,2*i,col); |
|
| 111 |
else if( fType[i]==BRIGHTNESS ) brightness(sign(pointDegree),2*i,col); |
|
| 112 |
else if( fType[i]==SMOOTH_BRIGHTNESS ) brightness( pointDegree ,2*i,col); |
|
| 113 |
else if( fType[i]==CONTRAST ) contrast (sign(pointDegree),2*i,col); |
|
| 114 |
else if( fType[i]==SMOOTH_CONTRAST ) contrast ( pointDegree ,2*i,col); |
|
| 115 |
else if( fType[i]==SATURATION ) saturation(sign(pointDegree),2*i,col); |
|
| 116 |
else if( fType[i]==SMOOTH_SATURATION ) saturation( pointDegree ,2*i,col); |
|
| 95 |
if( fType[i]==CHROMA ) chroma (sign(pointDegree),2*i,pixel); |
|
| 96 |
else if( fType[i]==SMOOTH_CHROMA ) chroma ( pointDegree ,2*i,pixel); |
|
| 97 |
else if( fType[i]==ALPHA ) alpha (sign(pointDegree),2*i,pixel); |
|
| 98 |
else if( fType[i]==SMOOTH_ALPHA ) alpha ( pointDegree ,2*i,pixel); |
|
| 99 |
else if( fType[i]==BRIGHTNESS ) brightness(sign(pointDegree),2*i,pixel); |
|
| 100 |
else if( fType[i]==SMOOTH_BRIGHTNESS ) brightness( pointDegree ,2*i,pixel); |
|
| 101 |
else if( fType[i]==CONTRAST ) contrast (sign(pointDegree),2*i,pixel); |
|
| 102 |
else if( fType[i]==SMOOTH_CONTRAST ) contrast ( pointDegree ,2*i,pixel); |
|
| 103 |
else if( fType[i]==SATURATION ) saturation(sign(pointDegree),2*i,pixel); |
|
| 104 |
else if( fType[i]==SMOOTH_SATURATION ) saturation( pointDegree ,2*i,pixel); |
|
| 117 | 105 |
} |
| 118 | 106 |
#endif |
| 119 | 107 |
|
| 120 |
gl_FragColor = vec4(col.rgb * 0.5 * (v_Normal.z+1.0), col.a);
|
|
| 108 |
gl_FragColor = vec4(pixel.rgb * 0.5 * (v_Normal.z+1.0), pixel.a);
|
|
| 121 | 109 |
} |
Also available in: Unified diff
Remove the MACROBLOCK Effect altogether.