-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathspringVP.cpp
69 lines (55 loc) · 2.08 KB
/
springVP.cpp
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
//float ksStr, ksShr, ksBnd, kdStr, kdShr, kdBnd;//uniforms
vec2 getNeighbor(int n, out float ks, out float kd)
{
//structural springs (adjacent neighbors)
if (n < 4){ ks = 0.1; kd = 0.1; } //ksStr, kdStr
if (n == 0) return vec2(1.0, 0.0);
if (n == 1) return vec2(0.0, -1.0);
if (n == 2) return vec2(-1.0, 0.0);
if (n == 3) return vec2(0.0, 1.0);
//shear springs (diagonal neighbors)
if (n<8) {ks = 0.1;kd = 0.1;} //ksShr,kdShr
if (n == 4) return vec2(1.0, -1.0);
if (n == 5) return vec2(-1.0, -1.0);
if (n == 6) return vec2(-1.0, 1.0);
if (n == 7) return vec2(1.0, 1.0);
//bend spring (adjacent neighbors 1 node away)
if (n<12) { ks = ksBnd;kd = kdBnd;} //ksBnd,kdBnd
if (n == 8) return vec2(2.0, 0.0);
if (n == 9) return vec2(0.0, -2.0);
if (n == 10) return vec2(-2.0, 0.0);
if (n == 11) return vec2(0.0, 2.0);
}
float ks, kd;
for (int k = 0; k < 12; k++)
{
vec2 nCoord = getNeighbor(k, ks, kd);
float inv_cloth_size = 1.0 / (100.0);//size of a single patch in world space
float rest_length = length(nCoord*inv_cloth_size);
float nxid = xid + nCoord.x;
float nyid = yid + nCoord.y;
if (nxid < 0.0 || nxid>99.0 || nyid<0.0 || nyid>99.0) continue;
nCoord = vec2(nyid,nxid) / 100.0;
vec3 posNP = texture2D(u_texPos, nCoord);
vec3 prevNP = texture2D(u_texPrevPos, nCoord);
vec3 v2 = (posNP - prevNP) / timestep;
vec3 deltaP = pos.xyz - posNP;
vec3 deltaV = vel - prevNP;
float dist = length(deltaP);
float leftTerm = -ks * (dist - rest_length);
float rightTerm = kd * (dot(deltaV, deltaP) / dist);
vec3 springForce = (leftTerm + rightTerm)* normalize(deltaP);
F += springForce;
}
'//shear springs (diagonal neighbors)',
'if (n<8) { ks = 0.1; kd = 0.1; } //ksShr,kdShr',
'if (n == 4) return vec2(1.0, -1.0);',
'if (n == 5) return vec2(-1.0, -1.0);',
'if (n == 6) return vec2(-1.0, 1.0);',
'if (n == 7) return vec2(1.0, 1.0);',
//bend spring (adjacent neighbors 1 node away)
'if (n<12) { ks = ksBnd; kd = kdBnd; }', //ksBnd,kdBnd
'if (n == 8) return vec2(2.0, 0.0);',
'if (n == 9) return vec2(0.0, -2.0);',
'if (n == 10) return vec2(-2.0, 0.0);',
'if (n == 11) return vec2(0.0, 2.0);',