/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
Unknown | 134 lines | 108 code | 26 blank | 0 comment | 0 complexity | 8dd34fdea31ccaa4c1623240426cf9ef MD5 | raw file
Possible License(s): LGPL-2.1
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
26uniform mat4 projection_matrix;
27
28ATTRIBUTE vec3 position;
29ATTRIBUTE vec3 normal;
30ATTRIBUTE vec2 texcoord0;
31ATTRIBUTE vec4 clothing;
32
33VARYING vec4 vertex_color;
34VARYING vec2 vary_texcoord0;
35
36vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
37mat4 getSkinnedTransform();
38void calcAtmospherics(vec3 inPositionEye);
39
40uniform vec4 color;
41
42uniform vec4 gWindDir;
43uniform vec4 gSinWaveParams;
44uniform vec4 gGravity;
45
46const vec4 gMinMaxConstants = vec4(1.0, 0.166666, 0.0083143, .00018542); // #minimax-generated coefficients
47const vec4 gPiConstants = vec4(0.159154943, 6.28318530, 3.141592653, 1.5707963); // # {1/2PI, 2PI, PI, PI/2}
48
49void main()
50{
51 vary_texcoord0 = texcoord0;
52
53 vec4 pos;
54 mat4 trans = getSkinnedTransform();
55
56 vec3 norm;
57 norm.x = dot(trans[0].xyz, normal);
58 norm.y = dot(trans[1].xyz, normal);
59 norm.z = dot(trans[2].xyz, normal);
60 norm = normalize(norm);
61
62 //wind
63 vec4 windEffect;
64 windEffect = vec4(dot(norm, gWindDir.xyz));
65 pos.x = dot(trans[2].xyz, position.xyz);
66 windEffect.xyz = pos.x * vec3(0.015, 0.015, 0.015)
67 + windEffect.xyz;
68 windEffect.w = windEffect.w * 2.0 + 1.0; // move wind offset value to [-1, 3]
69 windEffect.w = windEffect.w*gWindDir.w; // modulate wind strength
70
71 windEffect.xyz = windEffect.xyz*gSinWaveParams.xyz
72 +vec3(gSinWaveParams.w); // use sin wave params to scale and offset input
73
74
75 //reduce to period of 2 PI
76 vec4 temp1, temp0, temp2, offsetPos;
77 temp1.xyz = windEffect.xyz * gPiConstants.x; // change input as multiple of [0-2PI] to [0-1]
78 temp0.y = mod(temp1.x,1.0);
79 windEffect.x = temp0.y * gPiConstants.y; // scale from [0,1] to [0, 2PI]
80 temp1.z = temp1.z - gPiConstants.w; // shift normal oscillation by PI/2
81 temp0.y = mod(temp1.z,1.0);
82
83 windEffect.z = temp0.y * gPiConstants.y; // scale from [0,1] to [0, 2PI]
84 windEffect.xyz = windEffect.xyz + vec3(-3.141592); // offset to [-PI, PI]
85
86
87 //calculate sinusoid
88 vec4 sinWave;
89 temp1 = windEffect*windEffect;
90 sinWave = -temp1 * gMinMaxConstants.w
91 + vec4(gMinMaxConstants.z); // y = -(x^2)/7! + 1/5!
92 sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.y); // y = -(x^2) * (-(x^2)/7! + 1/5!) + 1/3!
93 sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.x); // y = -(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1
94 sinWave = sinWave * windEffect; // y = x * (-(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1)
95
96 // sinWave.x holds sin(norm . wind_direction) with primary frequency
97 // sinWave.y holds sin(norm . wind_direction) with secondary frequency
98 // sinWave.z hold cos(norm . wind_direction) with primary frequency
99 sinWave.xyz = sinWave.xyz * gWindDir.w
100 + vec3(windEffect.w); // multiply by wind strength in gWindDir.w [-wind, wind]
101
102 // add normal facing bias offset [-wind,wind] -> [-wind - .25, wind + 1]
103 temp1 = vec4(dot(norm, gGravity.xyz)); // how much is this normal facing in direction of gGravity?
104 temp1 = min(temp1, vec4(0.2,0.0,0.0,0.0)); // clamp [-1, 1] to [-1, 0.2]
105 temp1 = temp1*vec4(1.5,0.0,0.0,0.0); // scale from [-1,0.2] to [-1.5, 0.3]
106 sinWave.x = sinWave.x + temp1.x; // add gGravity effect to sinwave (only primary frequency)
107 sinWave.xyz = sinWave.xyz * clothing.w; // modulate by clothing coverage
108
109 sinWave.xyz = max(sinWave.xyz, vec3(-1.0, -1.0, -1.0)); // clamp to underlying body shape
110 offsetPos = clothing * sinWave.x; // multiply wind effect times clothing displacement
111 temp2 = gWindDir*sinWave.z + vec4(norm,0); // calculate normal offset due to wind oscillation
112 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
113 norm += temp2.xyz*2.0; // add sin wave effect on normals (exaggerated)
114
115 //add "backlighting" effect
116 float colorAcc;
117 colorAcc = 1.0 - clothing.w;
118 norm.z -= colorAcc * 0.2;
119
120 //renormalize normal (again)
121 norm = normalize(norm);
122
123 pos.x = dot(trans[0], offsetPos);
124 pos.y = dot(trans[1], offsetPos);
125 pos.z = dot(trans[2], offsetPos);
126 pos.w = 1.0;
127
128 calcAtmospherics(pos.xyz);
129
130 vec4 col = calcLighting(pos.xyz, norm, color, vec4(0.0));
131 vertex_color = col;
132
133 gl_Position = projection_matrix * pos;
134}