@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
2 lines (1 loc) • 2.68 kB
JavaScript
export default "precision highp float;\nprecision highp sampler2D;\n\nuniform vec2 tSize;\nuniform float order;\nuniform float constraintInfluence;\nuniform sampler2D tPosition0;\nuniform sampler2D tPosition1;\n\nuniform sampler2D tDistancesA;\nuniform sampler2D tDistancesB;\n\nuniform sampler2D tAdjacentsA;\nuniform sampler2D tAdjacentsB;\n\n\n\n// compute offset based on current distance and spring rest distance\nvec3 getDisplacement( vec3 point0, vec3 point1, float restDistance ) {\n\n float curDistance = distance( point0, point1 );\n return constraintInfluence * ( curDistance - restDistance ) * ( point1 - point0 ) / curDistance;\n\n}\n\n// *** ADD COMMON ***\n\nvec2 getUV( float id ) {\n return getClothSolverUV( id, tSize );\n}\n\n\nvoid main() {\n\n vec3 displacement;\n vec2 uv = gl_FragCoord.xy / tSize.xy;\n\n // indices of adjacent vertices\n vec4 adjacentA = texture2D( tAdjacentsA, uv );\n vec4 adjacentB = texture2D( tAdjacentsB, uv );\n\n // distances of adjacent vertices\n vec4 distancesA = texture2D( tDistancesA, uv );\n vec4 distancesB = texture2D( tDistancesB, uv );\n\n // vertex position\n vec3 p0 = packPosition( uv );\n float count = 0.0;\n\n // adjacent vertices positions\n float Ax = adjacentA.x;\n if( Ax >= 0.0 ){\n vec3 p1 = packPosition( getUV( Ax ) );\n displacement += getDisplacement( p0, p1, distancesA.x );\n count += 1.0;\n }\n float Ay = adjacentA.y;\n if( Ay >= 0.0 ){\n vec3 p2 = packPosition( getUV( adjacentA.y ) );\n displacement += getDisplacement( p0, p2, distancesA.y );\n count += 1.0;\n }\n float Az = adjacentA.z;\n if( Az >= 0.0 ){\n vec3 p3 = packPosition( getUV( adjacentA.z ) );\n displacement += getDisplacement( p0, p3, distancesA.z );\n count += 1.0;\n }\n float Aw = adjacentA.w;\n if( Aw >= 0.0 ){\n vec3 p4 = packPosition( getUV( adjacentA.w ) );\n displacement += getDisplacement( p0, p4, distancesA.w );\n count += 1.0;\n }\n\n float Bx = adjacentB.x;\n if( Bx >= 0.0 ){\n vec3 p5 = packPosition( getUV( Bx ) );\n displacement += getDisplacement( p0, p5, distancesB.x );\n count += 1.0;\n }\n float By = adjacentB.y;\n if( By >= 0.0 ){\n vec3 p6 = packPosition( getUV( By ) );\n displacement += getDisplacement( p0, p6, distancesB.y );\n count += 1.0;\n }\n float Bz = adjacentB.z;\n if( Bz >= 0.0 ){\n vec3 p7 = packPosition( getUV( Bz ) );\n displacement += getDisplacement( p0, p7, distancesB.z );\n count += 1.0;\n }\n float Bw = adjacentB.w;\n if( Bw >= 0.0 ){\n vec3 p8 = packPosition( getUV( Bw ) );\n displacement += getDisplacement( p0, p8, distancesB.w );\n count += 1.0;\n }\n\n p0 += displacement / count;\n\n gl_FragColor = vec4( unpackPosition( p0, order ), 1.0 );\n\n}\n";