| 202 |
202 |
//
|
| 203 |
203 |
// Constants:
|
| 204 |
204 |
// a) A : valid values: (0,infinity). 'Bendiness' if the surface - the higher A is, the more the surface
|
| 205 |
|
// bends. A<=0 destroys the system,
|
|
205 |
// bends. A<=0 destroys the system.
|
| 206 |
206 |
// b) B : valid values: <-1,1>. The amount side edges get 'sucked' inwards when we pull the middle of the
|
| 207 |
207 |
// top edge up. B=0 --> not at all, B=1: a looot. B=-0.5: the edges will actually be pushed outwards
|
| 208 |
208 |
// quite a bit. One can also set it to <-1 or >1, but it will look a bit ridiculous.
|
| ... | ... | |
| 214 |
214 |
|
| 215 |
215 |
void deform(in int effect, inout vec4 v)
|
| 216 |
216 |
{
|
| 217 |
|
const vec2 one = vec2(1.0,1.0);
|
|
217 |
const vec2 ONE = vec2(1.0,1.0);
|
| 218 |
218 |
|
| 219 |
219 |
const float A = 0.5;
|
| 220 |
220 |
const float B = 0.2;
|
| 221 |
221 |
const float C = 5.0;
|
| 222 |
222 |
|
| 223 |
223 |
vec2 center = vUniforms[effect+1].yz;
|
| 224 |
|
vec2 force = vUniforms[effect].xy;
|
| 225 |
|
vec2 dist = center-v.xy;
|
| 226 |
|
vec2 aDist = abs(dist.xy);
|
| 227 |
|
vec2 maxdist= u_objD.xy + abs(center);
|
|
224 |
vec2 ps = center-v.xy;
|
|
225 |
vec2 aPS = abs(ps);
|
|
226 |
vec2 maxps = u_objD.xy + abs(center);
|
|
227 |
vec2 force = vUniforms[effect].xy * degree_region(vUniforms[effect+2],ps);
|
| 228 |
228 |
vec2 aForce = abs(force);
|
| 229 |
229 |
|
| 230 |
|
vec2 Aw = A*maxdist;
|
| 231 |
|
vec2 quot = dist / maxdist;
|
|
230 |
vec2 Aw = A*maxps;
|
|
231 |
vec2 quot = ps / maxps;
|
| 232 |
232 |
quot = quot*quot; // ( (x/W)^2 , (y/H)^2 ) where x,y are distances from V to center
|
| 233 |
233 |
|
| 234 |
234 |
float denomV = 1.0 / (aForce.y + Aw.x);
|
| 235 |
235 |
float denomH = 1.0 / (aForce.x + Aw.y);
|
| 236 |
236 |
|
| 237 |
|
vec2 vertCorr= one - aDist / ( aForce+C*aDist + (one-sign(aForce)) );
|
|
237 |
vec2 vertCorr= ONE - aPS / ( aForce+C*aPS + (ONE-sign(aForce)) );
|
| 238 |
238 |
|
| 239 |
|
float mvXvert = -B * dist.x * aForce.y * (1.0-quot.y) * denomV; // impact the vertical component of the force vector has on horizontal movement
|
| 240 |
|
float mvYhorz = -B * dist.y * aForce.x * (1.0-quot.x) * denomH; // impact the horizontal component of the force vector has on vertical movement
|
|
239 |
float mvXvert = -B * ps.x * aForce.y * (1.0-quot.y) * denomV; // impact the vertical component of the force vector has on horizontal movement
|
|
240 |
float mvYhorz = -B * ps.y * aForce.x * (1.0-quot.x) * denomH; // impact the horizontal component of the force vector has on vertical movement
|
| 241 |
241 |
float mvYvert = force.y * (1.0-quot.x*Aw.x*denomV) * vertCorr.y; // impact the vertical component of the force vector has on vertical movement
|
| 242 |
242 |
float mvXhorz = -force.x * (1.0-quot.y*Aw.y*denomH) * vertCorr.x; // impact the horizontal component of the force vector has on horizontal movement
|
| 243 |
243 |
|
DEFORM: add support for Regions