350 |
350 |
void wave(in int effect, inout vec4 v, inout vec4 n)
|
351 |
351 |
{
|
352 |
352 |
vec2 center = vUniforms[effect+1].zw;
|
353 |
|
float sinA = vUniforms[effect ].y;
|
354 |
|
float cosA = vUniforms[effect+1].x;
|
355 |
|
float sinB = vUniforms[effect ].w;
|
356 |
|
float cosB = vUniforms[effect+1].y;
|
357 |
353 |
float amplitude = vUniforms[effect ].x;
|
358 |
354 |
float length = vUniforms[effect ].z;
|
359 |
355 |
|
360 |
356 |
vec2 ps = center-v.xy;
|
361 |
357 |
float deg = amplitude*degree_region(vUniforms[effect+2],ps);
|
362 |
358 |
|
363 |
|
if( deg != 0.0 )
|
|
359 |
if( deg != 0.0 && length != 0.0 )
|
364 |
360 |
{
|
365 |
|
float angle = length==0.0 ? 0.0 : 1.578*(ps.x*cosB+ps.y*sinB) / length;
|
366 |
|
v.xyz += sin(angle)*deg*vec3(sinB*cosA,cosB*cosA,sinA);
|
|
361 |
float sinA = vUniforms[effect ].y;
|
|
362 |
float cosA = vUniforms[effect+1].x;
|
|
363 |
float sinB = vUniforms[effect ].w;
|
|
364 |
float cosB = vUniforms[effect+1].y;
|
|
365 |
|
|
366 |
float angle = 1.578*(ps.x*cosB+ps.y*sinB) / length;
|
|
367 |
vec3 dir = vec3(sinB*cosA,cosB*cosA,sinA);
|
|
368 |
|
|
369 |
v.xyz += sin(angle)*deg*dir;
|
|
370 |
|
|
371 |
float sqrtX = sqrt(dir.y*dir.y + dir.z*dir.z);
|
|
372 |
float sqrtY = sqrt(dir.x*dir.x + dir.z*dir.z);
|
|
373 |
|
|
374 |
float sinX = ( sqrtX==0.0 ? 0.0 : dir.z / sqrtX);
|
|
375 |
float cosX = ( sqrtX==0.0 ? 1.0 : dir.y / sqrtX);
|
|
376 |
float sinY = ( sqrtY==0.0 ? 0.0 : dir.z / sqrtY);
|
|
377 |
float cosY = ( sqrtY==0.0 ? 1.0 : dir.y / sqrtY);
|
|
378 |
|
|
379 |
float tmp = 1.578*cos(angle)*deg/length;
|
|
380 |
|
|
381 |
float fx = cosB*tmp;
|
|
382 |
float fy = sinB*tmp;
|
|
383 |
|
|
384 |
vec3 sx = vec3 (1.0+cosX*fx,cosY*sinX*fx,sinY*sinX*fx);
|
|
385 |
vec3 sy = vec3 (cosX*sinY*fy,1.0+cosY*fy,sinX*sinY*fy);
|
|
386 |
|
|
387 |
vec3 normal = cross(sx,sy);
|
|
388 |
|
|
389 |
if( n.z != 0.0 )
|
|
390 |
{
|
|
391 |
n.xyz = n.z*normal;
|
|
392 |
}
|
367 |
393 |
}
|
368 |
394 |
}
|
369 |
395 |
|
Shades of the WAVE effect (almost!) working.