@andespindola/brainlink 0.1.0-beta.60 → 0.1.0-beta.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -22,6 +22,7 @@ const zoomCapTargetViewportShare = 0.72
|
|
|
22
22
|
const meshEdgeScaleThreshold = 0.09
|
|
23
23
|
const meshEdgeMinBudget = 140
|
|
24
24
|
const meshEdgeMaxBudget = 1400
|
|
25
|
+
const layeredCoreScaleThreshold = 0.55
|
|
25
26
|
const state = {
|
|
26
27
|
graph: { nodes: [], edges: [] },
|
|
27
28
|
nodes: [],
|
|
@@ -567,6 +568,70 @@ const nodeBudgetForScale = (scale) => {
|
|
|
567
568
|
return renderNodeBudget
|
|
568
569
|
}
|
|
569
570
|
|
|
571
|
+
const layerWindowForScale = (scale) => {
|
|
572
|
+
if (scale < 0.08) return { inner: 0.78, outer: 1 }
|
|
573
|
+
if (scale < 0.14) return { inner: 0.62, outer: 0.9 }
|
|
574
|
+
if (scale < 0.24) return { inner: 0.46, outer: 0.74 }
|
|
575
|
+
if (scale < 0.36) return { inner: 0.3, outer: 0.58 }
|
|
576
|
+
if (scale < layeredCoreScaleThreshold) return { inner: 0.16, outer: 0.42 }
|
|
577
|
+
if (scale < 0.9) return { inner: 0.06, outer: 0.26 }
|
|
578
|
+
return { inner: 0, outer: 0.14 }
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
const selectLayeredNodesForScale = (sourceNodes) => {
|
|
582
|
+
const hub = state.primaryHub
|
|
583
|
+
if (!hub || sourceNodes.length <= 1200 || state.visibleNodes.length <= massiveGraphNodeThreshold) {
|
|
584
|
+
return sourceNodes
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
let maxDistance = 0
|
|
588
|
+
const distances = sourceNodes.map((node) => {
|
|
589
|
+
const distance = Math.hypot(node.x - hub.x, node.y - hub.y)
|
|
590
|
+
if (distance > maxDistance) {
|
|
591
|
+
maxDistance = distance
|
|
592
|
+
}
|
|
593
|
+
return { node, distance }
|
|
594
|
+
})
|
|
595
|
+
|
|
596
|
+
if (maxDistance <= 0.001) {
|
|
597
|
+
return sourceNodes
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
const window = layerWindowForScale(state.transform.scale)
|
|
601
|
+
const inner = window.inner * maxDistance
|
|
602
|
+
const outer = window.outer * maxDistance
|
|
603
|
+
const layered = distances
|
|
604
|
+
.filter((item) => item.distance >= inner && item.distance <= outer)
|
|
605
|
+
.map((item) => item.node)
|
|
606
|
+
|
|
607
|
+
if (state.transform.scale >= layeredCoreScaleThreshold && !layered.some((node) => node.id === hub.id)) {
|
|
608
|
+
layered.push(hub)
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
if (layered.length > 0) {
|
|
612
|
+
return layered
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
const midpoint = (window.inner + window.outer) / 2
|
|
616
|
+
const fallback = [...distances]
|
|
617
|
+
.sort((left, right) => {
|
|
618
|
+
const leftNorm = left.distance / maxDistance
|
|
619
|
+
const rightNorm = right.distance / maxDistance
|
|
620
|
+
const leftDelta = Math.abs(leftNorm - midpoint)
|
|
621
|
+
const rightDelta = Math.abs(rightNorm - midpoint)
|
|
622
|
+
if (leftDelta !== rightDelta) return leftDelta - rightDelta
|
|
623
|
+
return left.node.id.localeCompare(right.node.id)
|
|
624
|
+
})
|
|
625
|
+
.slice(0, Math.min(900, sourceNodes.length))
|
|
626
|
+
.map((item) => item.node)
|
|
627
|
+
|
|
628
|
+
if (state.transform.scale >= layeredCoreScaleThreshold && !fallback.some((node) => node.id === hub.id)) {
|
|
629
|
+
fallback.push(hub)
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
return fallback
|
|
633
|
+
}
|
|
634
|
+
|
|
570
635
|
const edgeIdentityKey = edge => {
|
|
571
636
|
if (!edge.target) return ''
|
|
572
637
|
const pair = edge.source < edge.target
|
|
@@ -1465,10 +1530,11 @@ const computeRenderVisibility = () => {
|
|
|
1465
1530
|
if (state.visibleNodes.length > massiveGraphNodeThreshold) {
|
|
1466
1531
|
const viewportNodes = viewportNodesFromSpatialIndex(viewport)
|
|
1467
1532
|
const sourceNodes = viewportNodes.length > 0 ? viewportNodes : state.visibleNodes
|
|
1533
|
+
const layeredNodes = selectLayeredNodesForScale(sourceNodes)
|
|
1468
1534
|
const sampleLimit = nodeBudgetForScale(state.transform.scale)
|
|
1469
|
-
const sampled =
|
|
1470
|
-
? sampleVisibleNodes(Math.min(sampleLimit, renderNodeBudget),
|
|
1471
|
-
:
|
|
1535
|
+
const sampled = layeredNodes.length > sampleLimit
|
|
1536
|
+
? sampleVisibleNodes(Math.min(sampleLimit, renderNodeBudget), layeredNodes)
|
|
1537
|
+
: layeredNodes.slice(0, Math.min(layeredNodes.length, renderNodeBudget))
|
|
1472
1538
|
const sampledIds = new Set(sampled.map((node) => node.id))
|
|
1473
1539
|
let sampledEdges = state.transform.scale >= 0.035 ? collectVisibleEdgesForNodes(sampledIds) : []
|
|
1474
1540
|
let sampledNodes = ensureHubNodesInRenderedSet(sampled)
|
package/package.json
CHANGED