@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
JavaScript
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;