Files
VPS_Setup/caddy/site/site-lib/scripts/graph-render-worker.js

1 line
5.5 KiB
JavaScript
Raw Normal View History

2025-11-04 21:35:28 +00:00
if("function"==typeof importScripts){importScripts("https://d157l7jdn8e5sf.cloudfront.net/v7.2.0/webworker.js"),addEventListener("message",onMessage),self.WebGLRenderingContext=self.WebGL2RenderingContext||self.WebGLRenderingContext;let e=null,t=null,n=null;isDrawing=!1;let a=0,o=[],r=[],i=0,l=[],c=[],d=[],s=[],u=[],p={x:0,y:0},g=new Float32Array(0),f=0,h=0,x={background:2302755,link:11184810,node:13421772,outline:11184810,text:16777215,accent:4203434},y=-1,S=-1,b=-1,m=!1,v=[],w=-1,C=1,T=1;function toScreenSpace(e,t,n=!0){return n?{x:Math.floor(e*C+p.x),y:Math.floor(t*C+p.y)}:{x:e*C+p.x,y:t*C+p.y}}function vecToScreenSpace({x:e,y:t},n=!0){return toScreenSpace(e,t,n)}function toWorldspace(e,t){return{x:(e-p.x)/C,y:(t-p.y)/C}}function vecToWorldspace({x:e,y:t}){return toWorldspace(e,t)}function setCameraCenterWorldspace({x:e,y:t}){p.x=canvas.width/2-e*C,p.y=canvas.height/2-t*C}function getCameraCenterWorldspace(){return toWorldspace(canvas.width/2,canvas.height/2)}function getNodeScreenRadius(e){return e*T}function getNodeWorldspaceRadius(e){return e/T}function getPosition(e){return{x:g[2*e],y:g[2*e+1]}}function parseHex(e){if("number"==typeof e)return e;if("string"==typeof e)return e=e.replace(/^#/,""),parseInt(e,16);throw new Error("Invalid hex color. Must be a string or number.")}function hexToRgb(e){const t=parseHex(e);return{r:t>>16&255,g:t>>8&255,b:255&t}}function rgbToHex(e,t,n){return clamp(e,0,255)<<16|clamp(t,0,255)<<8|clamp(n,0,255)}function mixColors(e,t,n){const a=hexToRgb(e),o=hexToRgb(t),r=clamp(n,0,1);return rgbToHex(Math.round(a.r+(o.r-a.r)*r),Math.round(a.g+(o.g-a.g)*r),Math.round(a.b+(o.b-a.b)*r))}function toHexString(e){return"#"+e.toString(16).padStart(6,"0")}function invertColor(e,t){for(e=e.toString(16);e.length<6;)e="0"+e;if(0===e.indexOf("#")&&(e=e.slice(1)),3===e.length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),6!==e.length)throw new Error("Invalid HEX color:"+e);var n=parseInt(e.slice(0,2),16),a=parseInt(e.slice(2,4),16),o=parseInt(e.slice(4,6),16);return t?.299*n+.587*a+.114*o>186?"#000000":"#FFFFFF":(n=(255-n).toString(16),a=(255-a).toString(16),o=(255-o).toString(16),"#"+padZero(n)+padZero(a)+padZero(o))}function clamp(e,t,n){return Math.min(Math.max(e,t),n)}function lerp(e,t,n){return e+(t-e)*n}let M=0,k=.04,F=0,P=.08,I=15,N=12,R=I/N;function showLabel(e,t,n=0){let a=u[e];if(!a)return;if(d[e]=t,!(t>.01))return void hideLabel(e);a.visible=!0,a.style.fontSize=lerp(N,I,n);let o=vecToScreenSpace(getPosition(e)),r=s[e]*lerp(1,R,n)/2;a.x=o.x-r,a.y=o.y+getNodeScreenRadius(l[e])+9,a.alpha=t}function hideLabel(e){u[e].visible=!1}function draw(){n.clear();let e=[];m&&(v=[]),-1!=y||-1!=b?(M=Math.min(1,M+k),F=Math.min(1,F+P)):(M=Math.max(0,M-k),F=Math.max(0,F-P)),n.lineStyle(1,mixColors(x.link,x.background,.5*M),.7);for(let t=0;t<a;t++){let a=r[t],i=o[t];y!=i&&y!=a&&(S!=i&&S!=a||0==M)||(m&&y==i?v.push(a):m&&y==a&&v.push(i),e.push(t));let c=getPosition(i),d=getPosition(a),s=vecToScreenSpace(c),u=vecToScreenSpace(d);Math.sqrt(Math.pow(c.x-d.x,2)+Math.pow(c.y-d.y,2))<(l[i]+l[a])*h&&(n.moveTo(s.x,s.y),n.lineTo(u.x,u.y))}let t=1-.5*M;n.beginFill(mixColors(x.node,x.background,.5*M),t),n.lineStyle(0,16777215);for(let e=0;e<i;e++){let t=getNodeScreenRadius(l[e]);if(y!=e)if(t>2){showLabel(e,lerp(0,(t-4)/8-1/T/6*.9,Math.max(1-M,.2)))}else hideLabel(e);if(y==e||S==e&&0!=M||-1!=y&&v.includes(e))continue;let a=vecToScreenSpace(getPosition(e));n.drawCircle(a.x,a.y,t)}n.endFill(),t=.7*M,n.lineStyle(1,mixColors(mixColors(x.link,x.accent,M),x.background,.2),t);for(let t=0;t<e.length;t++){let a=r[e[t]],i=vecToScreenSpace(getPosition(o[e[t]])),l=vecToScreenSpace(getPosition(a));n.moveTo(i.x,i.y),n.lineTo(l.x,l.y)}if(-1!=y||-1!=S&&0!=M){n.beginFill(mixColors(x.node,x.accent,.2*M),.9),n.lineStyle(0,16777215);for(let e=0;e<v.length;e++){let t=v[e],a=vecToScreenSpace(getPosition(t));n.drawCircle(a.x,a.y,getNodeScreenRadius(l[t])),showLabel(t,Math.max(.6*M,d[t]))}n.endFill();let e=-1!=y?y:S,t=vecToScreenSpace(getPosition(e));n.beginFill(mixColors(x.node,x.accent,M),1),n.lineStyle(M,mixColors(invertColor(x.background,!0),x.accent,.5))