Revision 5e58293a
Added by Leszek Koltunski over 8 years ago
| src/main/res/raw/main_vertex_shader.glsl | ||
|---|---|---|
| 214 | 214 |
// along the force line is. |
| 215 | 215 |
// 0<=C<1 looks completely ridiculous and C<0 destroys the system. |
| 216 | 216 |
|
| 217 |
void deform(in int effect, inout vec3 v, inout vec3 n)
|
|
| 217 |
void deform(in int effect, inout vec3 v) |
|
| 218 | 218 |
{
|
| 219 | 219 |
const vec2 ONE = vec2(1.0,1.0); |
| 220 | 220 |
|
| ... | ... | |
| 247 | 247 |
|
| 248 | 248 |
v.x -= (mvXvert+mvXhorz); |
| 249 | 249 |
v.y -= (mvYvert+mvYhorz); |
| 250 |
|
|
| 251 | 250 |
v.z += force.z*d*d*(3.0*d*d -8.0*d +6.0); // thick bubble |
| 252 |
float b = -(12.0*force.z*d*(1.0-d)*(1.0-d)*(1.0-d))*one_over_denom;// |
|
| 253 |
|
|
| 254 |
n.xy += n.z*b*ps; |
|
| 255 | 251 |
} |
| 256 | 252 |
|
| 257 | 253 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 309 | 305 |
// Thus we actually want to compute N(v.x,v.y) = a*(-(dx/|PS|)*f'(|PX|), -(dy/|PS|)*f'(|PX|), 1) and keep adding |
| 310 | 306 |
// the first two components. (a is the horizontal part) |
| 311 | 307 |
|
| 312 |
void distort(in int effect, inout vec3 v, inout vec3 n)
|
|
| 308 |
void distort(in int effect, inout vec3 v) |
|
| 313 | 309 |
{
|
| 314 | 310 |
vec2 center = vUniforms[effect+1].yz; |
| 315 | 311 |
vec2 ps = center-v.xy; |
| 316 | 312 |
vec3 force = vUniforms[effect].xyz; |
| 317 | 313 |
float d = degree(vUniforms[effect+2],center,ps); |
| 318 |
float denom = dot(ps+(1.0-d)*force.xy,ps); |
|
| 319 |
float one_over_denom = 1.0/(denom-0.001*(sign(denom)-1.0)); // = denom==0 ? 1000:1/denom; |
|
| 320 | 314 |
|
| 321 |
//v.z += force.z*d; // cone |
|
| 322 |
//b = -(force.z*(1.0-d))*one_over_denom; // |
|
| 323 |
|
|
| 324 |
//v.z += force.z*d*d*(3.0-2.0*d); // thin bubble |
|
| 325 |
//b = -(6.0*force.z*d*(1.0-d)*(1.0-d))*one_over_denom; // |
|
| 326 |
|
|
| 327 |
v.z += force.z*d*d*(3.0*d*d -8.0*d +6.0); // thick bubble |
|
| 328 |
float b = -(12.0*force.z*d*(1.0-d)*(1.0-d)*(1.0-d))*one_over_denom; // |
|
| 329 |
|
|
| 315 |
//v.z += force.z*d; // cone |
|
| 316 |
//v.z += force.z*d*d*(3.0-2.0*d); // thin bubble |
|
| 317 |
v.z += force.z*d*d*(3.0*d*d -8.0*d +6.0); // thick bubble |
|
| 318 |
|
|
| 330 | 319 |
v.xy += d*force.xy; |
| 331 |
n.xy += n.z*b*ps; |
|
| 332 | 320 |
} |
| 333 | 321 |
|
| 334 | 322 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 460 | 448 |
// |
| 461 | 449 |
// Generally speaking I'd keep to amplitude < length, as the opposite case has some other problems as well. |
| 462 | 450 |
|
| 463 |
void wave(in int effect, inout vec3 v, inout vec3 n)
|
|
| 451 |
void wave(in int effect, inout vec3 v) |
|
| 464 | 452 |
{
|
| 465 | 453 |
vec2 center = vUniforms[effect+1].yz; |
| 466 | 454 |
float amplitude = vUniforms[effect ].x; |
| ... | ... | |
| 485 | 473 |
vec3 dir= vec3(sinB*cosA,cosB*cosA,sinA); |
| 486 | 474 |
|
| 487 | 475 |
v += sin(angle)*deg*dir; |
| 488 |
|
|
| 489 |
if( n.z != 0.0 ) |
|
| 490 |
{
|
|
| 491 |
float sqrtX = sqrt(dir.y*dir.y + dir.z*dir.z); |
|
| 492 |
float sqrtY = sqrt(dir.x*dir.x + dir.z*dir.z); |
|
| 493 |
|
|
| 494 |
float sinX = ( sqrtY==0.0 ? 0.0 : dir.z / sqrtY); |
|
| 495 |
float cosX = ( sqrtY==0.0 ? 1.0 : dir.x / sqrtY); |
|
| 496 |
float sinY = ( sqrtX==0.0 ? 0.0 : dir.z / sqrtX); |
|
| 497 |
float cosY = ( sqrtX==0.0 ? 1.0 : dir.y / sqrtX); |
|
| 498 |
|
|
| 499 |
float abs_z = dir.z <0.0 ? -(sinX*sinY) : (sinX*sinY); |
|
| 500 |
|
|
| 501 |
float tmp = 1.578*cos(angle)*deg/length; |
|
| 502 |
|
|
| 503 |
float fx =-cosB*tmp; |
|
| 504 |
float fy = sinB*tmp; |
|
| 505 |
|
|
| 506 |
vec3 sx = vec3 (1.0+cosX*fx,cosY*sinX*fx,abs_z*fx); |
|
| 507 |
vec3 sy = vec3 (cosX*sinY*fy,1.0+cosY*fy,abs_z*fy); |
|
| 508 |
|
|
| 509 |
vec3 normal = cross(sx,sy); |
|
| 510 |
|
|
| 511 |
if( normal.z<=0.0 ) // Why this bizarre shit rather than the straightforward |
|
| 512 |
{ //
|
|
| 513 |
normal.x= 0.0; // if( normal.z>0.0 ) |
|
| 514 |
normal.y= 0.0; // {
|
|
| 515 |
normal.z= 1.0; // n.x = (n.x*normal.z + n.z*normal.x); |
|
| 516 |
} // n.y = (n.y*normal.z + n.z*normal.y); |
|
| 517 |
// n.z = (n.z*normal.z); |
|
| 518 |
// } |
|
| 519 |
n.x = (n.x*normal.z + n.z*normal.x); // |
|
| 520 |
n.y = (n.y*normal.z + n.z*normal.y); // ? Because if we do the above, my shitty Nexus4 crashes |
|
| 521 |
n.z = (n.z*normal.z); // during shader compilation! |
|
| 522 |
} |
|
| 523 | 476 |
} |
| 524 | 477 |
} |
| 525 | 478 |
|
| ... | ... | |
| 533 | 486 |
vec3 n = a_Normal; |
| 534 | 487 |
|
| 535 | 488 |
#if NUM_VERTEX>0 |
| 489 |
|
|
| 490 |
vec3 b1; |
|
| 491 |
float len = n.x*n.x+n.y*n.y; |
|
| 492 |
float l = u_objD.x / 2.0; |
|
| 493 |
|
|
| 494 |
if( len>0.0 ) |
|
| 495 |
{
|
|
| 496 |
len = sqrt(len); |
|
| 497 |
b1 = vec3( n.y/len,-n.x/len,0.0); |
|
| 498 |
} |
|
| 499 |
else |
|
| 500 |
{
|
|
| 501 |
b1 = vec3(1.0,0.0,0.0); |
|
| 502 |
} |
|
| 503 |
|
|
| 504 |
vec3 b2 = cross(n,b1); |
|
| 505 |
vec3 v1 = v+b1; |
|
| 506 |
vec3 v2 = v+b2; |
|
| 507 |
|
|
| 536 | 508 |
int j=0; |
| 537 | 509 |
|
| 538 | 510 |
for(int i=0; i<vNumEffects; i++) |
| 539 | 511 |
{
|
| 540 |
if( vType[i]==DISTORT) distort(j,v,n); |
|
| 541 |
else if( vType[i]==DEFORM ) deform (j,v,n); |
|
| 542 |
else if( vType[i]==SINK ) sink (j,v); |
|
| 543 |
else if( vType[i]==PINCH ) pinch (j,v); |
|
| 544 |
else if( vType[i]==SWIRL ) swirl (j,v); |
|
| 545 |
else if( vType[i]==WAVE ) wave (j,v,n); |
|
| 512 |
if( vType[i]==DISTORT) |
|
| 513 |
{
|
|
| 514 |
distort(j,v); |
|
| 515 |
distort(j,v1); |
|
| 516 |
distort(j,v2); |
|
| 517 |
} |
|
| 518 |
else if( vType[i]==DEFORM ) |
|
| 519 |
{
|
|
| 520 |
deform (j,v); |
|
| 521 |
deform (j,v1); |
|
| 522 |
deform (j,v2); |
|
| 523 |
} |
|
| 524 |
else if( vType[i]==SINK ) |
|
| 525 |
{
|
|
| 526 |
sink (j,v); |
|
| 527 |
sink (j,v1); |
|
| 528 |
sink (j,v2); |
|
| 529 |
} |
|
| 530 |
else if( vType[i]==PINCH ) |
|
| 531 |
{
|
|
| 532 |
pinch (j,v); |
|
| 533 |
pinch (j,v1); |
|
| 534 |
pinch (j,v2); |
|
| 535 |
} |
|
| 536 |
else if( vType[i]==SWIRL ) |
|
| 537 |
{
|
|
| 538 |
swirl (j,v); |
|
| 539 |
swirl (j,v1); |
|
| 540 |
swirl (j,v2); |
|
| 541 |
} |
|
| 542 |
else if( vType[i]==WAVE ) |
|
| 543 |
{
|
|
| 544 |
wave (j,v); |
|
| 545 |
wave (j,v1); |
|
| 546 |
wave (j,v2); |
|
| 547 |
} |
|
| 546 | 548 |
|
| 547 | 549 |
j+=3; |
| 548 | 550 |
} |
| 549 |
|
|
| 551 |
|
|
| 552 |
n = cross(v1-v,v2-v); |
|
| 553 |
|
|
| 550 | 554 |
restrictZ(v.z); |
| 551 | 555 |
#endif |
| 552 | 556 |
|
Also available in: Unified diff
Effect-independent normals.