/usr/share/gem/examples/10.glsl/link.frag is in gem-doc 1:0.93.3-13.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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);
}
|