π What's New
Better-Looking Dense Graphs
The repulsion force was rebuilt around one idea: handle far and near neighbors differently.
- Far away β a stack of grids, coarse for distant points and finer closer in. A distant group counts as one blob at its average position, and every part of space is counted exactly once: no gaps, no double counting, nothing to tune.
- Up close β real point-to-point forces instead of an average. From each nearby grid cell a point takes up to 8 actual neighbors, picked at random and re-picked every tick, weighted so it averages out to the exact answer as the layout settles. Cells holding 8 points or fewer use all of them, so most graphs get exact close-range forces.
- Stacked points β points sitting at exactly the same spot have no direction to separate along, so each is pushed along its own random direction and the pile comes apart instead of staying stuck.
Dense hubs spread into readable clouds and tight clusters open up. It's also faster per simulation step. How it works in detail β
simulationRepulsionTheta no longer does anything β the new algorithm has no distance bands to tune. It's still accepted so existing configs keep working, but you can safely delete it.
Smoother Hover on Large Graphs
The GPU now keeps extra, off-screen images of the graph in which every pixel records which point β or which link β covers it. Hovering is then a quick lookup: read the pixels right under the cursor, instead of checking every point in the graph.
The point image is drawn smaller than the screen β half resolution, and capped on very large displays. Hover doesn't need pixel-perfect precision, and at full size the image would cost tens of megabytes of GPU memory. Links keep full resolution, because a thin link would otherwise fall between pixels and become hard to hover. Both images are redrawn only when the scene changes, and hover reads them without making anything wait.
Hover does nothing at all while the scene and the cursor are both still, and picking is forgiving: you don't have to hit a point dead-center.
Faster Rendering When Points Overlap
When opaque points overlap, only the one on top is visible. The opaque middles are now drawn first, starting with the topmost point, so the GPU can skip whatever is buried underneath instead of drawing it and painting over it. Soft edges and see-through points follow in a second pass, so the picture looks exactly the same β while heavily overlapping scenes render faster.
It's on by default, and applies while points are fully opaque and highlighting isn't in use β otherwise rendering falls back to the old single pass on its own. Set pointOcclusionCulling: false to switch it off entirely. Live demo: Misc β Point Occlusion Culling.
On-Demand Rendering
Frames are drawn only when something changes, and rendering stops completely when your graph is idle β no GPU, CPU, or battery spent on a static scene. Interactions, config changes, and data updates all wake rendering automatically.