Revision 82ee855a
Added by Leszek Koltunski about 9 years ago
| src/main/java/org/distorted/library/DistortedObject.java | ||
|---|---|---|
| 789 | 789 |
return mV.add(EffectNames.SINK, sink, center); |
| 790 | 790 |
} |
| 791 | 791 |
|
| 792 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 793 |
/** |
|
| 794 |
* Pull all points around the center of the Effect towards a line passing through the center |
|
| 795 |
* (that's if degree>=1) or push them away from the line (degree<=1) |
|
| 796 |
* |
|
| 797 |
* @param pinch The current degree of the Effect + angle the line forms with X-axis |
|
| 798 |
* @param center 3-dimensional Data that, at any given time, returns the Center of the Effect. |
|
| 799 |
* @param region Region that masks the Effect. |
|
| 800 |
* @return ID of the effect added, or -1 if we failed to add one. |
|
| 801 |
*/ |
|
| 802 |
public long pinch(Data2D pinch, Data3D center, Data4D region) |
|
| 803 |
{
|
|
| 804 |
return mV.add(EffectNames.PINCH, pinch, center, region); |
|
| 805 |
} |
|
| 806 |
|
|
| 807 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 808 |
/** |
|
| 809 |
* Pull all points around the center of the Effect towards a line passing through the center |
|
| 810 |
* (that's if degree>=1) or push them away from the line (degree<=1) |
|
| 811 |
* |
|
| 812 |
* @param pinch The current degree of the Effect + angle the line forms with X-axis |
|
| 813 |
* @param center 3-dimensional Data that, at any given time, returns the Center of the Effect. |
|
| 814 |
* @return ID of the effect added, or -1 if we failed to add one. |
|
| 815 |
*/ |
|
| 816 |
public long pinch(Data2D pinch, Data3D center) |
|
| 817 |
{
|
|
| 818 |
return mV.add(EffectNames.PINCH, pinch, center); |
|
| 819 |
} |
|
| 820 |
|
|
| 792 | 821 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 793 | 822 |
/** |
| 794 | 823 |
* Rotate part of the Object around the Center of the Effect by a certain angle. |
| src/main/java/org/distorted/library/EffectNames.java | ||
|---|---|---|
| 41 | 41 |
*/ |
| 42 | 42 |
public enum EffectNames |
| 43 | 43 |
{
|
| 44 |
// EFFECT NAME /////// EFFECT TYPE ////////////// UNITY /////////////////////////
|
|
| 44 |
// EFFECT NAME /////// EFFECT TYPE ////////////// UNITY /////////////// DIM // REGION // CENTER
|
|
| 45 | 45 |
|
| 46 | 46 |
///////////////////////////////////////////////////////////////////////////////// |
| 47 | 47 |
// MATRIX EFFECTS. |
| ... | ... | |
| 96 | 96 |
* Apply a 3D vector of force to area around a point on the surface of the Object. |
| 97 | 97 |
* <p> |
| 98 | 98 |
* Uniforms: (forceX ,forceY ,forceZ ,UNUSED , |
| 99 |
* UNUSED , UNUSED,centerX ,centerY ,
|
|
| 99 |
* UNUSED , centerX ,centerY , centerZ,
|
|
| 100 | 100 |
* regionX,regionY,regionRX,regionRY) |
| 101 | 101 |
* <p> |
| 102 | 102 |
* Unity: (forceX,forceY,forceZ) = (0,0,0) |
| ... | ... | |
| 106 | 106 |
* Deform the whole Object by applying a 2D vector of force to a center point. |
| 107 | 107 |
* <p> |
| 108 | 108 |
* Uniforms: (forceX,forceY,UNUSED,UNUSED, |
| 109 |
* UNUSED,UNUSED,centerX,centerY,
|
|
| 109 |
* UNUSED,centerX,centerY,centerZ,
|
|
| 110 | 110 |
* UNUSED,UNUSED,UNUSED,UNUSED) |
| 111 | 111 |
* <p> |
| 112 | 112 |
* Unity: (forceX,forceY) = (0,0) |
| ... | ... | |
| 116 | 116 |
* Pull (or push away) all points around a center point to (from) it. |
| 117 | 117 |
* <p> |
| 118 | 118 |
* Uniforms: (sinkFactor,UNUSED,UNUSED,UNUSED, |
| 119 |
* UNUSED,UNUSED,centerX,centerY,
|
|
| 119 |
* UNUSED,centerX,centerY,centerZ,
|
|
| 120 | 120 |
* regionX,regionY,regionRX,regionRY) |
| 121 | 121 |
* <p> |
| 122 | 122 |
* Unity: sinkFactor = 1 |
| 123 | 123 |
*/ |
| 124 | 124 |
SINK ( EffectTypes.VERTEX , new float[] {1.0f} , 1, true, true ),
|
| 125 |
/** |
|
| 126 |
* Pull (or push away) all points around a line to (from) it. |
|
| 127 |
* <p> |
|
| 128 |
* Uniforms: (pinchFactor,lineAngle,UNUSED,UNUSED, |
|
| 129 |
* UNUSED,centerX,centerY,centerZ, |
|
| 130 |
* regionX,regionY,regionRX,regionRY) |
|
| 131 |
* <p> |
|
| 132 |
* Unity: sinkFactor = 1 |
|
| 133 |
*/ |
|
| 134 |
PINCH ( EffectTypes.VERTEX , new float[] {1.0f} , 2, true, true ),
|
|
| 125 | 135 |
/** |
| 126 | 136 |
* Smoothly rotate a limited area around a center point. |
| 127 | 137 |
* <p> |
| 128 | 138 |
* Uniforms: (swirlAngle,UNUSED,UNUSED,UNUSED, |
| 129 |
* UNUSED, UNUSED,centerX,centerY,
|
|
| 139 |
* UNUSED, centerX,centerY,centerZ,
|
|
| 130 | 140 |
* regionX,regionY,regionRX,regionRY) |
| 131 | 141 |
* <p> |
| 132 | 142 |
* Unity: swirlAngle = 0 |
| ... | ... | |
| 137 | 147 |
* parameters. Details: {@link DistortedObject#wave(Data5D,Data2D)}
|
| 138 | 148 |
* <p> |
| 139 | 149 |
* Uniforms: (amplitude,length,phase,angleAlpha, |
| 140 |
* angleBeta, UNUSED,centerX,centerY,
|
|
| 150 |
* angleBeta, centerX,centerY,centerZ,
|
|
| 141 | 151 |
* regionX,regionY,regionRX,regionRY) |
| 142 | 152 |
* <p> |
| 143 | 153 |
* Unity: amplitude = 0 |
| src/main/java/org/distorted/library/EffectQueueVertex.java | ||
|---|---|---|
| 23 | 23 |
|
| 24 | 24 |
import org.distorted.library.message.EffectMessage; |
| 25 | 25 |
import org.distorted.library.type.Data1D; |
| 26 |
import org.distorted.library.type.Data2D; |
|
| 26 | 27 |
import org.distorted.library.type.Data3D; |
| 27 | 28 |
import org.distorted.library.type.Data4D; |
| 28 | 29 |
import org.distorted.library.type.Data5D; |
| 29 | 30 |
import org.distorted.library.type.Dynamic1D; |
| 31 |
import org.distorted.library.type.Dynamic2D; |
|
| 30 | 32 |
import org.distorted.library.type.Dynamic3D; |
| 31 | 33 |
import org.distorted.library.type.Dynamic4D; |
| 32 | 34 |
import org.distorted.library.type.Dynamic5D; |
| 33 | 35 |
import org.distorted.library.type.Static1D; |
| 36 |
import org.distorted.library.type.Static2D; |
|
| 34 | 37 |
import org.distorted.library.type.Static3D; |
| 35 | 38 |
import org.distorted.library.type.Static4D; |
| 36 | 39 |
import org.distorted.library.type.Static5D; |
| ... | ... | |
| 161 | 164 |
// Do various post-processing on already computed effects. |
| 162 | 165 |
// 1) here unlike in the fragment queue, we don't have to multiply the points by ModelView matrix because that gets done in the shader. |
| 163 | 166 |
// 2) in case of SWIRL, switch the angles from degrees to radians |
| 164 |
// 3) likewise in case of WAVE |
|
| 167 |
// 3) likewise in case of WAVE and PINCH
|
|
| 165 | 168 |
// 4) In case of DISTORT, invert the Y-axis |
| 166 | 169 |
|
| 167 | 170 |
private void postprocess(int effect) |
| ... | ... | |
| 170 | 173 |
{
|
| 171 | 174 |
mUniforms[NUM_UNIFORMS*effect ] = (float)(Math.PI*mUniforms[NUM_UNIFORMS*effect ]/180); |
| 172 | 175 |
} |
| 176 |
if( mName[effect]==EffectNames.PINCH.ordinal() ) |
|
| 177 |
{
|
|
| 178 |
mUniforms[NUM_UNIFORMS*effect+1] = (float)(Math.PI*mUniforms[NUM_UNIFORMS*effect+1]/180); |
|
| 179 |
} |
|
| 173 | 180 |
if( mName[effect]==EffectNames.WAVE.ordinal() ) |
| 174 | 181 |
{
|
| 175 | 182 |
mUniforms[NUM_UNIFORMS*effect+2] = (float)(Math.PI*mUniforms[NUM_UNIFORMS*effect+2]/180); |
| ... | ... | |
| 292 | 299 |
return -1; |
| 293 | 300 |
} |
| 294 | 301 |
|
| 302 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 303 |
// pinch |
|
| 304 |
|
|
| 305 |
synchronized long add(EffectNames eln, Data2D data, Data3D center, Data4D region) |
|
| 306 |
{
|
|
| 307 |
if( mMax[INDEX]>mNumEffects ) |
|
| 308 |
{
|
|
| 309 |
EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects); |
|
| 310 |
|
|
| 311 |
if( data instanceof Dynamic2D) |
|
| 312 |
{
|
|
| 313 |
mInter[0][mNumEffects] = (Dynamic2D)data; |
|
| 314 |
} |
|
| 315 |
else if( data instanceof Static2D) |
|
| 316 |
{
|
|
| 317 |
mInter[0][mNumEffects] = null; |
|
| 318 |
mUniforms[NUM_UNIFORMS*mNumEffects ] = ((Static2D)data).getX(); |
|
| 319 |
mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static2D)data).getY(); |
|
| 320 |
} |
|
| 321 |
|
|
| 322 |
return addPriv(eln,center,region); |
|
| 323 |
} |
|
| 324 |
|
|
| 325 |
return -1; |
|
| 326 |
} |
|
| 327 |
|
|
| 328 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 329 |
// pinch |
|
| 330 |
|
|
| 331 |
synchronized long add(EffectNames eln, Data2D data, Data3D center) |
|
| 332 |
{
|
|
| 333 |
if( mMax[INDEX]>mNumEffects ) |
|
| 334 |
{
|
|
| 335 |
EffectNames.fillWithUnities(eln.ordinal(), mUniforms, NUM_UNIFORMS*mNumEffects); |
|
| 336 |
|
|
| 337 |
if( data instanceof Dynamic2D) |
|
| 338 |
{
|
|
| 339 |
mInter[0][mNumEffects] = (Dynamic2D)data; |
|
| 340 |
} |
|
| 341 |
else if( data instanceof Static2D) |
|
| 342 |
{
|
|
| 343 |
mInter[0][mNumEffects] = null; |
|
| 344 |
mUniforms[NUM_UNIFORMS*mNumEffects ] = ((Static2D)data).getX(); |
|
| 345 |
mUniforms[NUM_UNIFORMS*mNumEffects+1] = ((Static2D)data).getY(); |
|
| 346 |
} |
|
| 347 |
|
|
| 348 |
return addPriv(eln,center,null); |
|
| 349 |
} |
|
| 350 |
|
|
| 351 |
return -1; |
|
| 352 |
} |
|
| 353 |
|
|
| 295 | 354 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 296 | 355 |
|
| 297 | 356 |
private long addPriv(EffectNames eln, Data3D center, Data4D region) |
| src/main/res/raw/main_vertex_shader.glsl | ||
|---|---|---|
| 309 | 309 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| 310 | 310 |
// SINK EFFECT |
| 311 | 311 |
// |
| 312 |
// Pull P=(v.x,v.y) towards S=vPoint[effect] with P' = P + (1-h)d(S-P)
|
|
| 313 |
// when h>1 we are pushing points away from S: P' = P + (1/h-1)d(S-P)
|
|
| 312 |
// Pull P=(v.x,v.y) towards center of the effect with P' = P + (1-h)*dist(S-P)
|
|
| 313 |
// when h>1 we are pushing points away from S: P' = P + (1/h-1)*dist(S-P)
|
|
| 314 | 314 |
|
| 315 | 315 |
void sink(in int effect,inout vec4 v) |
| 316 | 316 |
{
|
| ... | ... | |
| 322 | 322 |
v.xy += t*ps; |
| 323 | 323 |
} |
| 324 | 324 |
|
| 325 |
////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 326 |
// PINCH EFFECT |
|
| 327 |
// |
|
| 328 |
// Pull P=(v.x,v.y) towards the line that |
|
| 329 |
// a) passes through the center of the effect |
|
| 330 |
// b) forms angle defined in the 2nd interpolated value with the X-axis |
|
| 331 |
// with P' = P + (1-h)*dist(line to P) |
|
| 332 |
// when h>1 we are pushing points away from S: P' = P + (1/h-1)*dist(line to P) |
|
| 333 |
|
|
| 334 |
void pinch(in int effect,inout vec4 v) |
|
| 335 |
{
|
|
| 336 |
vec2 center = vUniforms[effect+1].yz; |
|
| 337 |
vec2 ps = center-v.xy; |
|
| 338 |
float h = vUniforms[effect].x; |
|
| 339 |
float t = degree(vUniforms[effect+2],center,ps) * (1.0-h)/max(1.0,h); |
|
| 340 |
float angle = vUniforms[effect].y; |
|
| 341 |
vec2 dir = vec2(sin(angle),-cos(angle)); |
|
| 342 |
|
|
| 343 |
v.xy += t*dot(ps,dir)*dir; |
|
| 344 |
} |
|
| 345 |
|
|
| 325 | 346 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| 326 | 347 |
// SWIRL EFFECT |
| 327 | 348 |
// |
| ... | ... | |
| 492 | 513 |
if( vType[i]==DISTORT) distort(3*i,v,n); |
| 493 | 514 |
else if( vType[i]==DEFORM ) deform (3*i,v); |
| 494 | 515 |
else if( vType[i]==SINK ) sink (3*i,v); |
| 516 |
else if( vType[i]==PINCH ) pinch (3*i,v); |
|
| 495 | 517 |
else if( vType[i]==SWIRL ) swirl (3*i,v); |
| 496 | 518 |
else if( vType[i]==WAVE ) wave (3*i,v,n); |
| 497 | 519 |
} |
Also available in: Unified diff
New vertex effect 'PINCH'