PageRenderTime 55ms CodeModel.GetById 14ms app.highlight 9ms RepoModel.GetById 1ms app.codeStats 1ms

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

https://bitbucket.org/lindenlab/viewer-beta/
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}