common.glsl 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #define PI 3.14159
  2. #define PI2 6.28318
  3. #define RECIPROCAL_PI2 0.15915494
  4. #define LOG2 1.442695
  5. #define EPSILON 1e-6
  6. float square( in float a ) { return a*a; }
  7. vec2 square( in vec2 a ) { return vec2( a.x*a.x, a.y*a.y ); }
  8. vec3 square( in vec3 a ) { return vec3( a.x*a.x, a.y*a.y, a.z*a.z ); }
  9. vec4 square( in vec4 a ) { return vec4( a.x*a.x, a.y*a.y, a.z*a.z, a.w*a.w ); }
  10. float saturate( in float a ) { return clamp( a, 0.0, 1.0 ); }
  11. vec2 saturate( in vec2 a ) { return clamp( a, 0.0, 1.0 ); }
  12. vec3 saturate( in vec3 a ) { return clamp( a, 0.0, 1.0 ); }
  13. vec4 saturate( in vec4 a ) { return clamp( a, 0.0, 1.0 ); }
  14. float average( in float a ) { return a; }
  15. float average( in vec2 a ) { return ( a.x + a.y) * 0.5; }
  16. float average( in vec3 a ) { return ( a.x + a.y + a.z) / 3.0; }
  17. float average( in vec4 a ) { return ( a.x + a.y + a.z + a.w) * 0.25; }
  18. float whiteCompliment( in float a ) { return saturate( 1.0 - a ); }
  19. vec2 whiteCompliment( in vec2 a ) { return saturate( vec2(1.0) - a ); }
  20. vec3 whiteCompliment( in vec3 a ) { return saturate( vec3(1.0) - a ); }
  21. vec4 whiteCompliment( in vec4 a ) { return saturate( vec4(1.0) - a ); }
  22. vec3 transformDirection( in vec3 normal, in mat4 matrix ) {
  23. return normalize( ( matrix * vec4( normal, 0.0 ) ).xyz );
  24. }
  25. // http://en.wikibooks.org/wiki/GLSL_Programming/Applying_Matrix_Transformations
  26. vec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {
  27. return normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );
  28. }
  29. vec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal) {
  30. float distance = dot( planeNormal, point-pointOnPlane );
  31. return point - distance * planeNormal;
  32. }
  33. float sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {
  34. return sign( dot( point - pointOnPlane, planeNormal ) );
  35. }
  36. vec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {
  37. return pointOnLine + lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) );
  38. }