Revision 57297c51
Added by Leszek Koltunski about 9 years ago
| src/main/res/raw/main_vertex_shader.glsl | ||
|---|---|---|
| 361 | 361 |
// |
| 362 | 362 |
// Also, in this case f(x,y) = amplitude*sin(x/length), with those 2 parameters passed in uniforms. |
| 363 | 363 |
// |
| 364 |
//////////////////////////////////////////////////////// |
|
| 364 |
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
| 365 | 365 |
// How to compute any generic effect of type (*) |
| 366 |
//////////////////////////////////////////////////////// |
|
| 366 |
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
| 367 | 367 |
// |
| 368 | 368 |
// By definition, the vertices move by f(x,y)*V. |
| 369 | 369 |
// |
| 370 | 370 |
// Normals are much more complicated. |
| 371 |
// Let angle X be the angle (0,Vy,Vz)((0,Vy,0)(Vx,Vy,Vz).
|
|
| 372 |
// Let angle Y be the angle (Vx,0,Vz)((Vx,0,0)(Vx,Vy,Vz).
|
|
| 371 |
// Let angle X be the angle (0,Vy,Vz)(0,Vy,0)(Vx,Vy,Vz). |
|
| 372 |
// Let angle Y be the angle (Vx,0,Vz)(Vx,0,0)(Vx,Vy,Vz). |
|
| 373 | 373 |
// |
| 374 | 374 |
// Then it can be shown that the resulting surface, at point to which point (x0,y0,0) got moved to, |
| 375 | 375 |
// has 2 tangent vectors given by |
| ... | ... | |
| 417 | 417 |
float sinB = vUniforms[effect ].w; |
| 418 | 418 |
float cosB = vUniforms[effect+1].y; |
| 419 | 419 |
|
| 420 |
float angle= 1.578*(-ps.x*cosB-ps.y*sinB) / length; // -ps.x and -ps.y because the 'ps=center-v.xy' inverts the XY axis! |
|
| 420 |
float angle= 1.578*(ps.x*cosB-ps.y*sinB) / length; |
|
| 421 |
|
|
| 421 | 422 |
vec3 dir = vec3(sinB*cosA,cosB*cosA,sinA); |
| 422 | 423 |
|
| 423 | 424 |
v.xyz += sin(angle)*deg*dir; |
| ... | ... | |
| 432 | 433 |
float sinY = ( sqrtX==0.0 ? 0.0 : dir.z / sqrtX); |
| 433 | 434 |
float cosY = ( sqrtX==0.0 ? 1.0 : dir.y / sqrtX); |
| 434 | 435 |
|
| 435 |
float absSinX = sinX<0.0 ? -sinX:sinX; |
|
| 436 |
float absSinY = sinY<0.0 ? -sinY:sinY; |
|
| 436 |
float abs_z = dir.z <0.0 ? -(sinX*sinY) : (sinX*sinY); |
|
| 437 | 437 |
|
| 438 | 438 |
float tmp = 1.578*cos(angle)*deg/length; |
| 439 | 439 |
|
| 440 |
float fx = cosB*tmp;
|
|
| 440 |
float fx =-cosB*tmp;
|
|
| 441 | 441 |
float fy = sinB*tmp; |
| 442 | 442 |
|
| 443 |
vec3 sx = vec3 (1.0+cosX*fx,cosY*sinX*fx,absSinY*sinX*fx);
|
|
| 444 |
vec3 sy = vec3 (cosX*sinY*fy,1.0+cosY*fy,absSinX*sinY*fy);
|
|
| 443 |
vec3 sx = vec3 (1.0+cosX*fx,cosY*sinX*fx,abs_z*fx);
|
|
| 444 |
vec3 sy = vec3 (cosX*sinY*fy,1.0+cosY*fy,abs_z*fy);
|
|
| 445 | 445 |
|
| 446 | 446 |
vec3 normal = cross(sx,sy); |
| 447 | 447 |
|
| 448 | 448 |
if( normal.z > 0.0 ) |
| 449 | 449 |
{
|
| 450 |
n.xy += (n.z/normal.z)*vec2(normal.x,normal.y); |
|
| 450 |
n.x = (n.x*normal.z + n.z*normal.x); |
|
| 451 |
n.y = (n.y*normal.z + n.z*normal.y); |
|
| 452 |
n.z = (n.z*normal.z); |
|
| 451 | 453 |
} |
| 452 | 454 |
} |
| 453 | 455 |
} |
Also available in: Unified diff
Correct one more issue with computation of WAVE.