/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl

https://bitbucket.org/lindenlab/viewer-beta/ · GLSL · 134 lines · 75 code · 26 blank · 33 comment · 0 complexity · 8dd34fdea31ccaa4c1623240426cf9ef MD5 · raw file

  1. /**
  2. * @file avatarV.glsl
  3. *
  4. * $LicenseInfo:firstyear=2007&license=viewerlgpl$
  5. * Second Life Viewer Source Code
  6. * Copyright (C) 2007, Linden Research, Inc.
  7. *
  8. * This library is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation;
  11. * version 2.1 of the License only.
  12. *
  13. * This library is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with this library; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. *
  22. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  23. * $/LicenseInfo$
  24. */
  25. uniform mat4 projection_matrix;
  26. ATTRIBUTE vec3 position;
  27. ATTRIBUTE vec3 normal;
  28. ATTRIBUTE vec2 texcoord0;
  29. ATTRIBUTE vec4 clothing;
  30. VARYING vec4 vertex_color;
  31. VARYING vec2 vary_texcoord0;
  32. vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
  33. mat4 getSkinnedTransform();
  34. void calcAtmospherics(vec3 inPositionEye);
  35. uniform vec4 color;
  36. uniform vec4 gWindDir;
  37. uniform vec4 gSinWaveParams;
  38. uniform vec4 gGravity;
  39. const vec4 gMinMaxConstants = vec4(1.0, 0.166666, 0.0083143, .00018542); // #minimax-generated coefficients
  40. const vec4 gPiConstants = vec4(0.159154943, 6.28318530, 3.141592653, 1.5707963); // # {1/2PI, 2PI, PI, PI/2}
  41. void main()
  42. {
  43. vary_texcoord0 = texcoord0;
  44. vec4 pos;
  45. mat4 trans = getSkinnedTransform();
  46. vec3 norm;
  47. norm.x = dot(trans[0].xyz, normal);
  48. norm.y = dot(trans[1].xyz, normal);
  49. norm.z = dot(trans[2].xyz, normal);
  50. norm = normalize(norm);
  51. //wind
  52. vec4 windEffect;
  53. windEffect = vec4(dot(norm, gWindDir.xyz));
  54. pos.x = dot(trans[2].xyz, position.xyz);
  55. windEffect.xyz = pos.x * vec3(0.015, 0.015, 0.015)
  56. + windEffect.xyz;
  57. windEffect.w = windEffect.w * 2.0 + 1.0; // move wind offset value to [-1, 3]
  58. windEffect.w = windEffect.w*gWindDir.w; // modulate wind strength
  59. windEffect.xyz = windEffect.xyz*gSinWaveParams.xyz
  60. +vec3(gSinWaveParams.w); // use sin wave params to scale and offset input
  61. //reduce to period of 2 PI
  62. vec4 temp1, temp0, temp2, offsetPos;
  63. temp1.xyz = windEffect.xyz * gPiConstants.x; // change input as multiple of [0-2PI] to [0-1]
  64. temp0.y = mod(temp1.x,1.0);
  65. windEffect.x = temp0.y * gPiConstants.y; // scale from [0,1] to [0, 2PI]
  66. temp1.z = temp1.z - gPiConstants.w; // shift normal oscillation by PI/2
  67. temp0.y = mod(temp1.z,1.0);
  68. windEffect.z = temp0.y * gPiConstants.y; // scale from [0,1] to [0, 2PI]
  69. windEffect.xyz = windEffect.xyz + vec3(-3.141592); // offset to [-PI, PI]
  70. //calculate sinusoid
  71. vec4 sinWave;
  72. temp1 = windEffect*windEffect;
  73. sinWave = -temp1 * gMinMaxConstants.w
  74. + vec4(gMinMaxConstants.z); // y = -(x^2)/7! + 1/5!
  75. sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.y); // y = -(x^2) * (-(x^2)/7! + 1/5!) + 1/3!
  76. sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.x); // y = -(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1
  77. sinWave = sinWave * windEffect; // y = x * (-(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1)
  78. // sinWave.x holds sin(norm . wind_direction) with primary frequency
  79. // sinWave.y holds sin(norm . wind_direction) with secondary frequency
  80. // sinWave.z hold cos(norm . wind_direction) with primary frequency
  81. sinWave.xyz = sinWave.xyz * gWindDir.w
  82. + vec3(windEffect.w); // multiply by wind strength in gWindDir.w [-wind, wind]
  83. // add normal facing bias offset [-wind,wind] -> [-wind - .25, wind + 1]
  84. temp1 = vec4(dot(norm, gGravity.xyz)); // how much is this normal facing in direction of gGravity?
  85. temp1 = min(temp1, vec4(0.2,0.0,0.0,0.0)); // clamp [-1, 1] to [-1, 0.2]
  86. temp1 = temp1*vec4(1.5,0.0,0.0,0.0); // scale from [-1,0.2] to [-1.5, 0.3]
  87. sinWave.x = sinWave.x + temp1.x; // add gGravity effect to sinwave (only primary frequency)
  88. sinWave.xyz = sinWave.xyz * clothing.w; // modulate by clothing coverage
  89. sinWave.xyz = max(sinWave.xyz, vec3(-1.0, -1.0, -1.0)); // clamp to underlying body shape
  90. offsetPos = clothing * sinWave.x; // multiply wind effect times clothing displacement
  91. temp2 = gWindDir*sinWave.z + vec4(norm,0); // calculate normal offset due to wind oscillation
  92. offsetPos = vec4(1.0,1.0,1.0,0.0)*offsetPos+vec4(position.xyz, 1.0); // add to offset vertex position, and zero out effect from w
  93. norm += temp2.xyz*2.0; // add sin wave effect on normals (exaggerated)
  94. //add "backlighting" effect
  95. float colorAcc;
  96. colorAcc = 1.0 - clothing.w;
  97. norm.z -= colorAcc * 0.2;
  98. //renormalize normal (again)
  99. norm = normalize(norm);
  100. pos.x = dot(trans[0], offsetPos);
  101. pos.y = dot(trans[1], offsetPos);
  102. pos.z = dot(trans[2], offsetPos);
  103. pos.w = 1.0;
  104. calcAtmospherics(pos.xyz);
  105. vec4 col = calcLighting(pos.xyz, norm, color, vec4(0.0));
  106. vertex_color = col;
  107. gl_Position = projection_matrix * pos;
  108. }