UNPKG

@jonobr1/force-directed-graph

Version:

GPU supercharged attraction-graph visualizations for the web built on top of Three.js

60 lines (46 loc) 1.51 kB
import { circle } from "./partials.js"; /** * Render points as RGB indexed frame buffer * for hit testing what the pointer has selected */ const hit = { vertexShader: ` uniform float sizeAttenuation; uniform float frustumSize; uniform float is2D; uniform float nodeRadius; uniform float nodeScale; uniform float hitScale; uniform sampler2D texturePositions; varying vec3 vColor; varying float vDistance; void main() { vec4 texel = texture2D( texturePositions, position.xy ); vec3 vPosition = texel.xyz; vPosition.z *= 1.0 - is2D; vec4 mvPosition = modelViewMatrix * vec4( vPosition, 1.0 ); gl_PointSize = nodeRadius * nodeScale; gl_PointSize *= mix( 1.0, frustumSize / - mvPosition.z, sizeAttenuation ); gl_PointSize *= hitScale; vDistance = 1.0 / - mvPosition.z; float r = mod( position.z, 255.0 ) / 255.0; float g = mod( floor( position.z / 255.0 ), 255.0 ) / 255.0; float b = mod( floor( position.z / pow( 255.0, 2.0 ) ), 255.0 ) / 255.0; vColor = vec3( r, g, b ); gl_Position = projectionMatrix * mvPosition; } `, fragmentShader: ` uniform float sizeAttenuation; uniform float frustumSize; varying vec3 vColor; varying float vDistance; ${circle} void main() { vec2 uv = 2.0 * vec2( gl_PointCoord ) - 1.0; float t = circle( uv, vec2( 0.0, 0.0 ), 0.5, 0.0 ); gl_FragColor = vec4( vColor, t ); } ` }; export default hit;