aboutsummaryrefslogtreecommitdiff
path: root/packages/noncvs/windows/extra/Gem/examples/10.glsl/link.frag
blob: 053cd5ef392671893717ec9ec9cac36c6e62dd09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
// Cyrille Henry 2008
#extension GL_ARB_texture_rectangle : enable

uniform sampler2DRect texture_mass, texture_mass_old, texture_normal;
uniform float init, gravite;
uniform vec2 wind;
uniform float D; 
uniform float K1; // rigiditée liaison
uniform float W,f,N; // amplitude du Wind et frequence; Noise
uniform float t; //temps

varying vec2 coord;

vec2 test1(vec2 V)
{
//	return(max(min(V,vec2(64.)),vec2(0.)));
	return(V);
}

void main (void)
{
	vec4 force = vec4(0,1.,0.,1.);

	if ( (coord.x < 92.) && (coord.y <  64.) )
	{
		vec3 dist;
		float taille;

		vec4 pos     = texture2DRect(texture_mass,    coord             );// -vec4(0.5);
		vec4 pos_old = texture2DRect(texture_mass_old,coord             );// -vec4(0.5);
		vec4 posG    = texture2DRect(texture_mass, (coord+vec2(-1., 0.)));// -vec4(0.5);
		vec4 posD    = texture2DRect(texture_mass, (coord+vec2( 1., 0.)));// -vec4(0.5); 
		vec4 posH    = texture2DRect(texture_mass, (coord+vec2( 0., 1.)));// -vec4(0.5);
		vec4 posB    = texture2DRect(texture_mass, (coord+vec2( 0.,-1.)));// -vec4(0.5);
		vec4 posHD   = texture2DRect(texture_mass, (coord+vec2( 1.,-1.)));// -vec4(0.5);
		vec4 posBG   = texture2DRect(texture_mass, (coord+vec2(-1., 1.)));// -vec4(0.5);
		vec4 posHG   = texture2DRect(texture_mass, (coord+vec2( 1., 1.)));// -vec4(0.5);
		vec4 posBD   = texture2DRect(texture_mass, (coord+vec2(-1.,-1.)));// -vec4(0.5);
		vec4 pos2G   = texture2DRect(texture_mass, (coord+vec2(-2., 0.)));// -vec4(0.5);
		vec4 pos2D   = texture2DRect(texture_mass, (coord+vec2( 2., 0.)));// -vec4(0.5);
		vec4 pos2H   = texture2DRect(texture_mass, (coord+vec2( 0., 2.)));// -vec4(0.5);
		vec4 pos2B   = texture2DRect(texture_mass, (coord+vec2( 0.,-2.)));// -vec4(0.5);
			// lecture des position des masses voisinnes

		force = pos-pos_old; 
			// ajout de la force d'inertie (conservation de la vitesse)

		force *= 1.-D; 
			// damping relatif a un point fix
			// ATTENTION, c'est le seul damping du system!


	// 4 liens direct (gauche / droite et haut / bas)
		// on ajoute une force ssi la taille est > 0
		// on limite aussi ds l'espace pour ne prendre en compte que le lien valide (effet de bord)

		dist = pos.xyz - posG.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.x >  1.) )
			{ force.xyz += -K1 * (taille - 1./1000.)* normalize(dist); }

		dist = pos.xyz - posD.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.x < 91.) )
			{ force.xyz += -K1 * (taille - 1./1000.)* normalize(dist); }

		dist = pos.xyz - posH.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.y < 63.) )
			{ force.xyz += -K1 * (taille - 1./1000.)* normalize(dist); }

		dist = pos.xyz - posB.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.y >  1.) )
			{ force.xyz += -K1 * (taille - 1./1000.)* normalize(dist); }

	// 4 liens diagonaux (haut gauche, bas droite, etc)
		dist = pos.xyz - posHD.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.x < 91.) && (coord.y >  1.) )
			{ force.xyz += -K1 * (taille - 1.4142/1000.)* normalize(dist); }
	 
		dist = pos.xyz - posBG.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.x >  1.) && (coord.y < 63.) )
			{ force.xyz += -K1 * (taille - 1.4142/1000.)* normalize(dist); }

		dist = pos.xyz - posHG.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.x < 91.) && (coord.y < 63.) )
			{ force.xyz += -K1 * (taille - 1.4142/1000.)* normalize(dist); }

		dist = pos.xyz - posBD.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.x >  1.) && (coord.y >  1.) )
			{ force.xyz += -K1 * (taille - 1.4142/1000.)* normalize(dist); }

	// 4 liens double longeur (rigidité de flexion)
		dist = pos.xyz - pos2G.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.x >  2.) )
			{ force.xyz += -K1 * (taille - 2./1000.)* normalize(dist); }

		dist = pos.xyz - pos2D.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.x < 90.) )
			{ force.xyz += -K1 * (taille - 2./1000.)* normalize(dist); }

		dist = pos.xyz - pos2H.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.y < 62.) )
			{ force.xyz += -K1 * (taille - 2./1000.)* normalize(dist); }

		dist = pos.xyz - pos2B.xyz ; 
		taille = length(dist) ;
		if ( (taille > 0.) && (coord.y >  2.) )
			{ force.xyz += -K1 * (taille - 2./1000.)* normalize(dist); }

	// autres forces
		vec4 normal = texture2DRect(texture_normal, coord*64.) -vec4(0.5);
		normal = normalize(normal);
	//	float force_wind = abs(dot(normalize(vec3(wind.xy,0.)),normal.xyz));

		force.r += wind.x/100.;
		force.g += gravite/100.;
		force.b += wind.y/100.;

	// ajout d'une force sinusoidal perpendiculaire a la direction du vent
		float W_sin  = cos(-t + f*0.01*gl_TexCoord[0].s);
		W_sin *= 91.- gl_TexCoord[0].s;
		W_sin /= 91.;
		W_sin *= 91.- gl_TexCoord[0].s;
		W_sin /= 91.;

		W_sin *= gl_TexCoord[0].t + 50.;
		W_sin /= 63.;
		W_sin *= gl_TexCoord[0].t + 50.;
		W_sin /= 63.;

		force.x += W*(-wind.y*W_sin);
		force.z += W*( wind.x*W_sin);

	// ajout d'un pseuo buit
		float W_noiseX = cos(t + 0.353 * coord.t + 0.0234434* coord.s + 345.2342);
		W_noiseX = cos(123456.35345 * W_noiseX + 234.23);
		float W_noiseY = cos(-2.2 * t  + 6235.457456 * W_noiseX + 567.456);
		float W_noiseZ = cos(5.*t + 8976457.457 * W_noiseX + 3464.54);
		W_noiseX = cos(323344.64345 * W_noiseX + 567.45);

		force.x += 0.00001 * N * W_noiseX;
		force.y += 0.00001 * N * W_noiseY;
		force.z += 0.00001 * N * W_noiseZ;


	// preparation de la sortie
		force = min(max(force,vec4(-0.5)),vec4(0.5));
			// min et max pour virer les +inf
		force += vec4(0.5,0.5,0.5,1.);
			// ajout de l'ofset pour etre entre 0 et 1
		force.a = 1.;
			// on vire la 4eme composante au cas ou.
	}
	gl_FragColor = mix(force,vec4(0.5,0.5,0.5,1.),init);
}