Created
October 24, 2024 17:16
-
-
Save austintackaberry/0dcb3c2f8e2f2ef16bf5f6f7caccfb7c to your computer and use it in GitHub Desktop.
Stripe globe reverse engineer attempt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // @ts-nocheck | |
| import { Globe } from "./Globe"; | |
| export class BlogGlobe { | |
| private el: HTMLElement; | |
| private globeEl: HTMLElement; | |
| private globe: any; | |
| private hasLoadingStarted: boolean = false; | |
| private isGlobeLoaded: boolean = false; | |
| private intersectionObserver: IntersectionObserver; | |
| constructor(el: HTMLElement) { | |
| this.el = el; | |
| this.globeEl = document.querySelector(".BlogGlobe__globe") as HTMLElement; | |
| this.setupIntersectionObserver(); | |
| } | |
| private setupIntersectionObserver() { | |
| const options = { | |
| root: null, | |
| rootMargin: "0px", | |
| threshold: 0.001, | |
| }; | |
| this.intersectionObserver = new IntersectionObserver((entries) => { | |
| entries.forEach((entry) => { | |
| if (entry.isIntersecting) { | |
| this.onIntersect(); | |
| } else { | |
| this.onSeparate(); | |
| } | |
| }); | |
| }, options); | |
| this.intersectionObserver.observe(this.el); | |
| } | |
| private async onIntersect() { | |
| await this.importGlobe(); | |
| this.globe?.play(); | |
| } | |
| private onSeparate() { | |
| if (this.isGlobeLoaded) { | |
| this.globe?.pause(); | |
| } | |
| } | |
| private async importGlobe() { | |
| if (this.hasLoadingStarted) return; | |
| this.hasLoadingStarted = true; | |
| if (this.globeEl) { | |
| this.isGlobeLoaded = true; | |
| this.globe = new Globe(this.globeEl); | |
| } | |
| } | |
| disconnect() { | |
| this.intersectionObserver.disconnect(); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import { | |
| SphereGeometry as B, | |
| Vector2 as T, | |
| TubeGeometry as ot, | |
| Vector3 as at, | |
| MeshPhongMaterial as nt, | |
| Vector3 as p, | |
| MeshPhongMaterial as U, | |
| ImageLoader as rt, | |
| TextureLoader as W, | |
| Float32BufferAttribute as q, | |
| BufferGeometry as V, | |
| Mesh as b, | |
| AmbientLight as j, | |
| RawShaderMaterial as X, | |
| PointLight as ht, | |
| SphereGeometry as K, | |
| DoubleSide as C, | |
| PerspectiveCamera as $, | |
| Object3D as y, | |
| WebGLRenderer as tt, | |
| Scene as et, | |
| CatmullRomCurve3 as it, | |
| CircleGeometry as st, | |
| Mesh, | |
| ShaderMaterial, | |
| BufferGeometry, | |
| Texture, | |
| SphereGeometry, | |
| Scene, | |
| MeshPhongMaterial, | |
| Vector2, | |
| Vector3, | |
| Line, | |
| CatmullRomCurve3, | |
| } from "three"; | |
| const G = Math.pow; | |
| var Zt = Math.PI / 180; | |
| function ct(a: number, t: number, e: number) { | |
| return Math.max(Math.min(a, e), t); | |
| } | |
| function z(a: number, t: number, e: number, i: number) { | |
| let o = a / i - 1; | |
| return -e * (o * G(o, 3) - 1) + t; | |
| } | |
| var F = { | |
| fl: ["27.9506", "-82.4572"], | |
| ad: ["42.5000", "1.5000"], | |
| ae: ["24.0000", "54.0000"], | |
| af: ["33.0000", "65.0000"], | |
| ag: ["17.0500", "-61.8000"], | |
| ai: ["18.2500", "-63.1667"], | |
| al: ["41.0000", "20.0000"], | |
| am: ["40.0000", "45.0000"], | |
| an: ["12.2500", "-68.7500"], | |
| ao: ["-12.5000", "18.5000"], | |
| ap: ["35.0000", "105.0000"], | |
| aq: ["-90.0000", "0.0000"], | |
| ar: ["-34.0000", "-64.0000"], | |
| as: ["-14.3333", "-170.0000"], | |
| at: ["47.3333", "13.3333"], | |
| au: ["-27.0000", "133.0000"], | |
| aw: ["12.5000", "-69.9667"], | |
| az: ["40.5000", "47.5000"], | |
| ba: ["44.0000", "18.0000"], | |
| bb: ["13.1667", "-59.5333"], | |
| bd: ["24.0000", "90.0000"], | |
| be: ["50.8333", "4.0000"], | |
| bf: ["13.0000", "-2.0000"], | |
| bg: ["43.0000", "25.0000"], | |
| bh: ["26.0000", "50.5500"], | |
| bi: ["-3.5000", "30.0000"], | |
| bj: ["9.5000", "2.2500"], | |
| bm: ["32.3333", "-64.7500"], | |
| bn: ["4.5000", "114.6667"], | |
| bo: ["-17.0000", "-65.0000"], | |
| br: ["-10.0000", "-55.0000"], | |
| bs: ["24.2500", "-76.0000"], | |
| bt: ["27.5000", "90.5000"], | |
| bv: ["-54.4333", "3.4000"], | |
| bw: ["-22.0000", "24.0000"], | |
| by: ["53.0000", "28.0000"], | |
| bz: ["17.2500", "-88.7500"], | |
| ca: ["54.0000", "-100.0000"], | |
| cc: ["-12.5000", "96.8333"], | |
| cd: ["0.0000", "25.0000"], | |
| cf: ["7.0000", "21.0000"], | |
| cg: ["-1.0000", "15.0000"], | |
| ch: ["47.0000", "8.0000"], | |
| ci: ["8.0000", "-5.0000"], | |
| ck: ["-21.2333", "-159.7667"], | |
| cl: ["-30.0000", "-71.0000"], | |
| cm: ["6.0000", "12.0000"], | |
| cn: ["35.0000", "105.0000"], | |
| co: ["4.0000", "-72.0000"], | |
| cr: ["10.0000", "-84.0000"], | |
| cu: ["21.5000", "-80.0000"], | |
| cv: ["16.0000", "-24.0000"], | |
| cx: ["-10.5000", "105.6667"], | |
| cy: ["35.0000", "33.0000"], | |
| cz: ["49.7500", "15.5000"], | |
| de: ["51.0000", "9.0000"], | |
| dj: ["11.5000", "43.0000"], | |
| dk: ["56.0000", "10.0000"], | |
| dm: ["15.4167", "-61.3333"], | |
| do: ["19.0000", "-70.6667"], | |
| dz: ["28.0000", "3.0000"], | |
| ec: ["-2.0000", "-77.5000"], | |
| ee: ["59.0000", "26.0000"], | |
| eg: ["27.0000", "30.0000"], | |
| eh: ["24.5000", "-13.0000"], | |
| er: ["15.0000", "39.0000"], | |
| es: ["40.0000", "-4.0000"], | |
| et: ["8.0000", "38.0000"], | |
| eu: ["47.0000", "8.0000"], | |
| fi: ["64.0000", "26.0000"], | |
| fj: ["-18.0000", "175.0000"], | |
| fk: ["-51.7500", "-59.0000"], | |
| fm: ["6.9167", "158.2500"], | |
| fo: ["62.0000", "-7.0000"], | |
| fr: ["46.0000", "2.0000"], | |
| ga: ["-1.0000", "11.7500"], | |
| gb: ["54.0000", "-2.0000"], | |
| gd: ["12.1167", "-61.6667"], | |
| ge: ["42.0000", "43.5000"], | |
| gf: ["4.0000", "-53.0000"], | |
| gh: ["8.0000", "-2.0000"], | |
| gi: ["36.1833", "-5.3667"], | |
| gl: ["72.0000", "-40.0000"], | |
| gm: ["13.4667", "-16.5667"], | |
| gn: ["11.0000", "-10.0000"], | |
| gp: ["16.2500", "-61.5833"], | |
| gq: ["2.0000", "10.0000"], | |
| gr: ["39.0000", "22.0000"], | |
| gs: ["-54.5000", "-37.0000"], | |
| gt: ["15.5000", "-90.2500"], | |
| gu: ["13.4667", "144.7833"], | |
| gw: ["12.0000", "-15.0000"], | |
| gy: ["5.0000", "-59.0000"], | |
| hk: ["22.2500", "114.1667"], | |
| hm: ["-53.1000", "72.5167"], | |
| hn: ["15.0000", "-86.5000"], | |
| hr: ["45.1667", "15.5000"], | |
| ht: ["19.0000", "-72.4167"], | |
| hu: ["47.0000", "20.0000"], | |
| id: ["-5.0000", "120.0000"], | |
| ie: ["53.0000", "-8.0000"], | |
| il: ["31.5000", "34.7500"], | |
| in: ["20.0000", "77.0000"], | |
| io: ["-6.0000", "71.5000"], | |
| iq: ["33.0000", "44.0000"], | |
| ir: ["32.0000", "53.0000"], | |
| is: ["65.0000", "-18.0000"], | |
| it: ["42.8333", "12.8333"], | |
| jm: ["18.2500", "-77.5000"], | |
| jo: ["31.0000", "36.0000"], | |
| jp: ["36.0000", "138.0000"], | |
| ke: ["1.0000", "38.0000"], | |
| kg: ["41.0000", "75.0000"], | |
| kh: ["13.0000", "105.0000"], | |
| ki: ["1.4167", "173.0000"], | |
| km: ["-12.1667", "44.2500"], | |
| kn: ["17.3333", "-62.7500"], | |
| kp: ["40.0000", "127.0000"], | |
| kr: ["37.0000", "127.5000"], | |
| kw: ["29.3375", "47.6581"], | |
| ky: ["19.5000", "-80.5000"], | |
| kz: ["48.0000", "68.0000"], | |
| la: ["18.0000", "105.0000"], | |
| lb: ["33.8333", "35.8333"], | |
| lc: ["13.8833", "-61.1333"], | |
| li: ["47.1667", "9.5333"], | |
| lk: ["7.0000", "81.0000"], | |
| lr: ["6.5000", "-9.5000"], | |
| ls: ["-29.5000", "28.5000"], | |
| lt: ["56.0000", "24.0000"], | |
| lu: ["49.7500", "6.1667"], | |
| lv: ["57.0000", "25.0000"], | |
| ly: ["25.0000", "17.0000"], | |
| ma: ["32.0000", "-5.0000"], | |
| mc: ["43.7333", "7.4000"], | |
| md: ["47.0000", "29.0000"], | |
| me: ["42.0000", "19.0000"], | |
| mg: ["-20.0000", "47.0000"], | |
| mh: ["9.0000", "168.0000"], | |
| mk: ["41.8333", "22.0000"], | |
| ml: ["17.0000", "-4.0000"], | |
| mm: ["22.0000", "98.0000"], | |
| mn: ["46.0000", "105.0000"], | |
| mo: ["22.1667", "113.5500"], | |
| mp: ["15.2000", "145.7500"], | |
| mq: ["14.6667", "-61.0000"], | |
| mr: ["20.0000", "-12.0000"], | |
| ms: ["16.7500", "-62.2000"], | |
| mt: ["35.8333", "14.5833"], | |
| mu: ["-20.2833", "57.5500"], | |
| mv: ["3.2500", "73.0000"], | |
| mw: ["-13.5000", "34.0000"], | |
| mx: ["23.0000", "-102.0000"], | |
| my: ["2.5000", "112.5000"], | |
| mz: ["-18.2500", "35.0000"], | |
| na: ["-22.0000", "17.0000"], | |
| nc: ["-21.5000", "165.5000"], | |
| ne: ["16.0000", "8.0000"], | |
| nf: ["-29.0333", "167.9500"], | |
| ng: ["10.0000", "8.0000"], | |
| ni: ["13.0000", "-85.0000"], | |
| nl: ["52.5000", "5.7500"], | |
| no: ["62.0000", "10.0000"], | |
| np: ["28.0000", "84.0000"], | |
| nr: ["-0.5333", "166.9167"], | |
| nu: ["-19.0333", "-169.8667"], | |
| nz: ["-41.0000", "174.0000"], | |
| om: ["21.0000", "57.0000"], | |
| pa: ["9.0000", "-80.0000"], | |
| pe: ["-10.0000", "-76.0000"], | |
| pf: ["-15.0000", "-140.0000"], | |
| pg: ["-6.0000", "147.0000"], | |
| ph: ["13.0000", "122.0000"], | |
| pk: ["30.0000", "70.0000"], | |
| pl: ["52.0000", "20.0000"], | |
| pm: ["46.8333", "-56.3333"], | |
| pr: ["18.2500", "-66.5000"], | |
| ps: ["32.0000", "35.2500"], | |
| pt: ["39.5000", "-8.0000"], | |
| pw: ["7.5000", "134.5000"], | |
| py: ["-23.0000", "-58.0000"], | |
| qa: ["25.5000", "51.2500"], | |
| re: ["-21.1000", "55.6000"], | |
| ro: ["46.0000", "25.0000"], | |
| rs: ["44.0000", "21.0000"], | |
| ru: ["60.0000", "100.0000"], | |
| rw: ["-2.0000", "30.0000"], | |
| sa: ["25.0000", "45.0000"], | |
| sb: ["-8.0000", "159.0000"], | |
| sc: ["-4.5833", "55.6667"], | |
| sd: ["15.0000", "30.0000"], | |
| se: ["62.0000", "15.0000"], | |
| sg: ["1.3667", "103.8000"], | |
| sh: ["-15.9333", "-5.7000"], | |
| si: ["46.0000", "15.0000"], | |
| sj: ["78.0000", "20.0000"], | |
| sk: ["48.6667", "19.5000"], | |
| sl: ["8.5000", "-11.5000"], | |
| sm: ["43.7667", "12.4167"], | |
| sn: ["14.0000", "-14.0000"], | |
| so: ["10.0000", "49.0000"], | |
| sr: ["4.0000", "-56.0000"], | |
| st: ["1.0000", "7.0000"], | |
| sv: ["13.8333", "-88.9167"], | |
| sy: ["35.0000", "38.0000"], | |
| sz: ["-26.5000", "31.5000"], | |
| tc: ["21.7500", "-71.5833"], | |
| td: ["15.0000", "19.0000"], | |
| tf: ["-43.0000", "67.0000"], | |
| tg: ["8.0000", "1.1667"], | |
| th: ["15.0000", "100.0000"], | |
| tj: ["39.0000", "71.0000"], | |
| tk: ["-9.0000", "-172.0000"], | |
| tm: ["40.0000", "60.0000"], | |
| tn: ["34.0000", "9.0000"], | |
| to: ["-20.0000", "-175.0000"], | |
| tr: ["39.0000", "35.0000"], | |
| tt: ["11.0000", "-61.0000"], | |
| tv: ["-8.0000", "178.0000"], | |
| tw: ["23.5000", "121.0000"], | |
| tz: ["-6.0000", "35.0000"], | |
| ua: ["49.0000", "32.0000"], | |
| ug: ["1.0000", "32.0000"], | |
| um: ["19.2833", "166.6000"], | |
| us: ["38.0000", "-97.0000"], | |
| uy: ["-33.0000", "-56.0000"], | |
| uz: ["41.0000", "64.0000"], | |
| va: ["41.9000", "12.4500"], | |
| vc: ["13.2500", "-61.2000"], | |
| ve: ["8.0000", "-66.0000"], | |
| vg: ["18.5000", "-64.5000"], | |
| vi: ["18.3333", "-64.8333"], | |
| vn: ["16.0000", "106.0000"], | |
| vu: ["-16.0000", "167.0000"], | |
| wf: ["-13.3000", "-176.2000"], | |
| ws: ["-13.5833", "-172.3333"], | |
| ye: ["15.0000", "48.0000"], | |
| yt: ["-12.8333", "45.1667"], | |
| za: ["-29.0000", "24.0000"], | |
| zm: ["-15.0000", "30.0000"], | |
| zw: ["-20.0000", "30.0000"], | |
| }; | |
| var I = Math.PI, | |
| lt = I / 2, | |
| $t = I / 4, | |
| t0 = I * 2, | |
| S = 180 / I, | |
| E = I / 180; | |
| var H = Math.atan2, | |
| D = Math.cos; | |
| var w = Math.sin; | |
| var Q = Math.sqrt; | |
| function dt(a: number) { | |
| return a > 1 ? lt : a < -1 ? -lt : Math.asin(a); | |
| } | |
| function Z(a: number) { | |
| return (a = w(a / 2)) * a; | |
| } | |
| function ut( | |
| a: [number, number], | |
| t: [number, number] | |
| ): (R: number) => [number, number] { | |
| let e = a[0] * E, | |
| i = a[1] * E, | |
| o = t[0] * E, | |
| r = t[1] * E, | |
| n = D(i), | |
| s = w(i), | |
| h = D(r), | |
| d = w(r), | |
| g = n * D(e), | |
| u = n * w(e), | |
| f = h * D(o), | |
| M = h * w(o), | |
| m = 2 * dt(Q(Z(r - i) + n * h * Z(o - e))), | |
| L = w(m), | |
| x = m | |
| ? function (R: number) { | |
| let l = w((R *= m)) / L, | |
| c = w(m - R) / L, | |
| Y = c * g + l * f, | |
| k = c * u + l * M, | |
| _t = c * s + l * d; | |
| return [H(k, Y) * S, H(_t, Q(Y * Y + k * k)) * S]; | |
| } | |
| : function () { | |
| return [e * S, i * S]; | |
| }; | |
| return (x.distance = m), x; | |
| } | |
| var mt = Math.PI / 180; | |
| function A(a: number, t: number, e: number) { | |
| let i = (90 - a) * mt, | |
| o = Number(t) * mt; | |
| return new p( | |
| -e * Math.sin(i) * Math.cos(o), | |
| e * Math.cos(i), | |
| e * Math.sin(i) * Math.sin(o) | |
| ); | |
| } | |
| var Rt = 0.2, | |
| Ct = 8, | |
| Tt = 44, | |
| It = 24, | |
| v = 0.35, | |
| O = 3e3, | |
| gt = O * 0.5, | |
| St = 160, | |
| Et = 500, | |
| _ = 0.01, | |
| pt = 0.01, | |
| Dt = 2500, | |
| N = class extends y { | |
| active: boolean = false; | |
| startTime: number = 0; | |
| animationFrame: number = 0; | |
| geometry: BufferGeometry; | |
| material: ShaderMaterial; | |
| circle1: Mesh; | |
| circle2: Mesh; | |
| colors: number[]; | |
| texture: Texture; | |
| isStatic: boolean; | |
| startLat: number; | |
| startLng: number; | |
| circleGeometry: SphereGeometry; | |
| circleMaterial1: MeshPhongMaterial; | |
| circleMaterial2: MeshPhongMaterial; | |
| mesh: Mesh; | |
| drawAnimatedLine: () => void; | |
| drawStaticLine: () => void; | |
| eraseLine: () => void; | |
| constructor( | |
| e: [number, number], | |
| i: [number, number], | |
| o: number[], | |
| r: Texture, | |
| n: Texture, | |
| s: number, | |
| h: boolean | |
| ) { | |
| super(); | |
| this.drawAnimatedLine = () => { | |
| if (!this.active) return; | |
| let e = this.geometry.drawRange.count, | |
| i = performance.now() - this.startTime; | |
| this.material.uniforms.u_time!.value = i; | |
| let o = z(i, 0, 1, Dt); | |
| if (((e = Math.min(O, Math.ceil(o * O))), this.active && e < O)) { | |
| let r = this.circle1.scale.x; | |
| if ((r < v && this.circle1.scale.set(r + _, r + _, r + _), e > gt)) { | |
| let n = this.circle2.scale.x; | |
| n < v && | |
| this.circle2.scale.set(n + _ * 1.5, n + _ * 1.5, n + _ * 1.5); | |
| } | |
| this.geometry.setDrawRange(0, e); | |
| } | |
| this.animationFrame = requestAnimationFrame(this.drawAnimatedLine); | |
| }; | |
| this.drawStaticLine = () => { | |
| this.geometry.setDrawRange(0, O), | |
| this.circle1.scale.set(v, v, v), | |
| this.circle2.scale.set(v, v, v); | |
| }; | |
| this.eraseLine = () => { | |
| let e = this.geometry.drawRange.count, | |
| i = this.geometry.drawRange.start; | |
| if ( | |
| ((this.material.uniforms.u_time!.value = | |
| performance.now() - this.startTime), | |
| i > e) | |
| ) | |
| return; | |
| let o = It * 2, | |
| r = this.circle1.scale.x, | |
| n = this.circle2.scale.x; | |
| if (r > 0.03) { | |
| let s = r - pt; | |
| this.circle1.scale.set(s, s, s); | |
| } | |
| if (i > gt && n > 0.03) { | |
| let s = n - pt * 1.5; | |
| this.circle2.scale.set(s, s, s); | |
| } | |
| this.geometry.setDrawRange(i + o, e), | |
| (this.animationFrame = requestAnimationFrame(this.eraseLine)); | |
| }; | |
| (this.colors = o), | |
| (this.texture = r), | |
| (this.isStatic = h), | |
| (this.startLat = e[0]), | |
| (this.startLng = e[1]); | |
| let d = i[0], | |
| g = i[1], | |
| u = A(this.startLat, this.startLng, s), | |
| f = A(d, g, s * 1.002), | |
| M = ct(u.distanceTo(f) * 0.5, St, Et), | |
| m = ut([this.startLng, this.startLat], [g, d]), | |
| L = m(0.25), | |
| x = m(0.75), | |
| R = A(L[1], L[0], s + M), | |
| l = A(x[1], x[0], s + M); | |
| // Create an array of Vector3 points | |
| const points = [u, R, l, f]; | |
| // Create a CatmullRomCurve3 from these points | |
| const curve = new CatmullRomCurve3(points); | |
| (this.geometry = new ot(curve, Tt, Rt + s / 1200, Ct, !1)), | |
| (this.material = new X({ | |
| uniforms: { | |
| u_time: { | |
| type: "f", | |
| value: 0, | |
| }, | |
| u_texture: { | |
| type: "t", | |
| value: null, | |
| }, | |
| speedEpsilon: { | |
| type: "f", | |
| value: 4e-4, | |
| }, | |
| }, | |
| vertexShader: ` | |
| varying vec2 vUv; | |
| void main() { | |
| vUv = uv; | |
| gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); | |
| } | |
| `, | |
| fragmentShader: ` | |
| uniform float u_time; | |
| uniform sampler2D u_texture; | |
| varying vec2 vUv; | |
| uniform float speedEpsilon; | |
| void main() { | |
| float ramp = vUv.x * 0.5; | |
| float pct = fract(ramp - u_time * speedEpsilon); | |
| vec4 color = vec4(0.0, 0.0, 0.0, 1.0); | |
| color = texture2D(u_texture, vec2(pct, 0.6)); | |
| gl_FragColor = vec4(color); | |
| } | |
| `, | |
| })), | |
| (this.active = !1), | |
| (this.mesh = new b(this.geometry, this.material)), | |
| this.add(this.mesh), | |
| (this.material.uniforms.u_texture!.value = this.texture), | |
| (this.circleMaterial1 = new U({ | |
| map: n, | |
| color: o[0], | |
| transparent: !0, | |
| opacity: 1, | |
| side: C, | |
| })), | |
| (this.circleMaterial2 = new U({ | |
| map: n, | |
| color: o[1], | |
| transparent: !0, | |
| opacity: 1, | |
| side: C, | |
| })), | |
| (this.circleGeometry = new K(s * 0.1, s * 0.1, 2)), | |
| (this.circle1 = new b(this.circleGeometry, this.circleMaterial1)), | |
| (this.circle2 = new b(this.circleGeometry, this.circleMaterial2)), | |
| this.circle1.scale.set(0.01, 0.01, 0.01), | |
| this.circle2.scale.set(0.01, 0.01, 0.01), | |
| this.circle1.position.set(u.x, u.y, u.z), | |
| this.circle2.position.set(f.x, f.y, f.z), | |
| this.circle1.rotation.set(Math.PI, Math.PI, Math.PI), | |
| this.circle2.rotation.set(Math.PI, Math.PI, Math.PI), | |
| this.circle1.lookAt(new p(0, 0, 0)), | |
| this.circle2.lookAt(new p(0, 0, 0)), | |
| this.add(this.circle1), | |
| this.add(this.circle2), | |
| this.showLine(); | |
| } | |
| showLine() { | |
| (this.active = !0), | |
| this.geometry.setDrawRange(0, 1), | |
| this.isStatic | |
| ? this.drawStaticLine() | |
| : ((this.startTime = performance.now()), this.drawAnimatedLine()); | |
| } | |
| hideLine() { | |
| (this.active = !1), this.eraseLine(); | |
| } | |
| disposeLine() { | |
| this.mesh.geometry.dispose(), | |
| this.texture.dispose(), | |
| this.mesh.material.dispose(), | |
| this.circle1.geometry.dispose(), | |
| this.circle1.material.dispose(), | |
| this.circle2.geometry.dispose(), | |
| this.circle2.material.dispose(), | |
| (this.children = null); | |
| } | |
| pause() { | |
| cancelAnimationFrame(this.animationFrame); | |
| } | |
| play() { | |
| this.isStatic | |
| ? this.drawStaticLine() | |
| : this.active | |
| ? (this.animationFrame = requestAnimationFrame(this.drawAnimatedLine)) | |
| : (this.animationFrame = requestAnimationFrame(this.eraseLine)); | |
| } | |
| }; | |
| var At = 1.8, | |
| Ot = | |
| "https://images.ctfassets.net/fzn2n1nzq965/11064gUb2CgTJXKVwAt5J9/297a98a65d04d4fbb979072ce60466ab/map_fill-a78643e8.png"; | |
| function Gt(a: HTMLImageElement) { | |
| let t = a.width, | |
| e = a.height, | |
| i = document.createElement("canvas"); | |
| (i.width = t), (i.height = e); | |
| let o = i.getContext("2d")!; | |
| return o.drawImage(a, 0, 0), o.getImageData(0, 0, t, e); | |
| } | |
| function Xt(a: Vector3, t: Vector3) { | |
| let e = new p(); | |
| e.subVectors(t, a).normalize(); | |
| let i = 1 - (0.5 + Math.atan2(e.z, e.x) / (2 * Math.PI)), | |
| o = 0.5 + Math.asin(e.y) / Math.PI; | |
| return new T(i, o); | |
| } | |
| function zt(a: Vector2, t: ImageData) { | |
| let e = t.width, | |
| i = t.height, | |
| o = Math.floor(a.x * e), | |
| r = Math.floor(a.y * i), | |
| n = o * 4 + r * (4 * e); | |
| return t.data.slice(n, n + 4); | |
| } | |
| var P = class extends y { | |
| radius: number; | |
| callback: () => void; | |
| isStatic: boolean; | |
| isDragging: boolean; | |
| dragTime: number; | |
| isDotsOnly: boolean; | |
| constructor(t: number, e: () => void, i: boolean, o: boolean) { | |
| super(), | |
| (this.callback = e), | |
| (this.isStatic = i), | |
| (this.rotation.x = -Math.PI), | |
| (this.rotation.z = -Math.PI), | |
| (this.radius = t), | |
| (this.isDragging = !1), | |
| (this.dragTime = 0), | |
| (this.isDotsOnly = o), | |
| new rt().load(Ot, (r) => { | |
| let n = Gt(r); | |
| this.mapLoaded(n); | |
| }); | |
| } | |
| mapLoaded(t) { | |
| let e = this.radius / 450, | |
| o = 1e4 + Math.floor(7e4 * (this.radius / 600)), | |
| r = this.radius, | |
| n = new st(At * e, 5), | |
| s = new V(), | |
| h = [], | |
| d = [], | |
| g = new p(); | |
| for (let M = o; M >= 0; M -= 1) { | |
| let m = Math.acos(-1 + (2 * M) / o), | |
| L = Math.sqrt(o * Math.PI) * m; | |
| g.setFromSphericalCoords(r, m, L), | |
| s.copy(n), | |
| s.lookAt(g), | |
| s.translate(g.x, g.y, g.z), | |
| s.computeBoundingSphere(); | |
| let x = Xt(s.boundingSphere!.center, this.position); | |
| if (zt(x, t)[3]! > 0 || this.isDotsOnly) { | |
| let l = Math.random(); | |
| for (let c = 0; c < 5; c += 1) | |
| h.push( | |
| s.attributes.position!.array[0], | |
| s.attributes.position!.array[1], | |
| s.attributes.position!.array[2], | |
| s.attributes.position!.array[3 + c * 3], | |
| s.attributes.position!.array[4 + c * 3], | |
| s.attributes.position!.array[5 + c * 3], | |
| s.attributes.position!.array[6 + c * 3], | |
| s.attributes.position!.array[7 + c * 3], | |
| s.attributes.position!.array[8 + c * 3] | |
| ), | |
| d.push(l, l, l); | |
| h.push( | |
| s.attributes.position!.array[0], | |
| s.attributes.position!.array[1], | |
| s.attributes.position!.array[2], | |
| s.attributes.position!.array[3], | |
| s.attributes.position!.array[4], | |
| s.attributes.position!.array[5], | |
| s.attributes.position!.array[18], | |
| s.attributes.position!.array[19], | |
| s.attributes.position!.array[20] | |
| ), | |
| d.push(l, l, l); | |
| } | |
| } | |
| let u = new V(); | |
| u.setAttribute("position", new q(h, 3)), | |
| u.setAttribute("rndId", new q(d, 1)), | |
| (this.material = new X({ | |
| transparent: !0, | |
| uniforms: { | |
| u_time: { | |
| type: "f", | |
| value: 0, | |
| }, | |
| u_drag_time: { | |
| type: "f", | |
| value: 0, | |
| }, | |
| u_resolution: { | |
| type: "v2", | |
| value: new T(), | |
| }, | |
| }, | |
| vertexShader: ` | |
| uniform float u_time; | |
| uniform float u_drag_time; | |
| uniform vec2 u_resolution; | |
| attribute float rndId; | |
| varying float vRndId; | |
| varying float pct; | |
| void main() { | |
| vRndId = rndId; | |
| vec2 st = position.xy/u_resolution; | |
| pct = min(1.0, u_time / (1000. / max(0.2, 0.2 * sin(fract(rndId))))); | |
| float vNormal = rndId + ((1.0 - rndId) * pct); | |
| vNormal = rndId + ((1.0 - rndId)); | |
| vNormal = smoothstep(0., 1.0, vNormal); | |
| if (u_drag_time > 0.) { | |
| vNormal -= ((sin(u_time / 400.0 * vRndId) + 1.0) * 0.04) * min(1., u_drag_time / 1200.0); | |
| } | |
| vec4 modelViewPosition = modelViewMatrix * vec4(position, vNormal); | |
| gl_Position = projectionMatrix * modelViewPosition; | |
| } | |
| `, | |
| fragmentShader: ` | |
| uniform bool u_dragging; | |
| uniform float u_time; | |
| uniform float u_drag_time; | |
| varying float vRndId; | |
| varying float pct; | |
| void main() { | |
| float v = sin(u_time / 200.0 * vRndId); | |
| float alpha = pct * 0.7 + v * 0.2; | |
| float r = 0.19; | |
| float g = 0.42; | |
| float b = 0.65; | |
| float dragDur = 1200.0; | |
| vec3 color = vec3(r, g, b); | |
| float rInc = min(1.0, u_drag_time / dragDur) * (sin(u_drag_time / (dragDur * 0.5) + 1.0) * 0.1); | |
| float gInc = min(1.0, u_drag_time / dragDur) * (sin(u_drag_time / (dragDur * 0.75) - 1.0) * 0.1); | |
| float bInc = min(1.0, u_drag_time / dragDur) * (sin(u_drag_time / dragDur) * 0.1); | |
| if (u_dragging) { | |
| color.r = r + rInc; | |
| color.g = g + gInc; | |
| color.b = b + bInc; | |
| } | |
| gl_FragColor = vec4(color, alpha); | |
| } | |
| `, | |
| })), | |
| (this.material.side = C); | |
| let f = new b(u, this.material); | |
| this.add(f), | |
| (this.material.uniforms.u_resolution.value.x = window.innerWidth), | |
| (this.material.uniforms.u_resolution.value.y = window.innerHeight), | |
| (this.startTime = performance.now()), | |
| (this.dragStartTime = 0), | |
| this.callback(); | |
| } | |
| startDragging() { | |
| !this.material || | |
| this.isStatic || | |
| ((this.isDragging = !0), | |
| (this.dragStartTime = performance.now()), | |
| (this.material.uniforms.u_time.value = | |
| performance.now() - this.dragStartTime)); | |
| } | |
| stopDragging() { | |
| this.isDragging = !1; | |
| } | |
| updateDragTimer() { | |
| this.isDragging | |
| ? (this.dragTime = performance.now() - this.dragStartTime) | |
| : this.dragTime > 0.1 && | |
| (this.dragTime = Math.max(0, this.dragTime * 0.9)); | |
| } | |
| animate() { | |
| if ((this.updateDragTimer(), !this.material)) return; | |
| this.material.uniforms.u_drag_time.value = this.dragTime; | |
| let t = this.isStatic ? 3e3 : performance.now() - this.startTime; | |
| this.material.uniforms.u_time.value = t; | |
| } | |
| }; | |
| var J = Math.PI * 2, | |
| Ft = Math.PI * 0.5, | |
| Nt = Math.PI * 0.1111, | |
| Pt = Math.PI, | |
| Yt = Math.PI * 0.1, | |
| ft = 350, | |
| kt = 30, | |
| Ut = 0.94, | |
| qt = 0.005, | |
| bt = 0.02, | |
| Vt = 0.001, | |
| wt = Math.PI * -0.5, | |
| Mt = Math.PI * 0.5, | |
| yt = 0.94, | |
| vt = -0.003, | |
| Bt = 512, | |
| Wt = 5, | |
| jt = 1e3, | |
| Ht = 4e3, | |
| Lt = [ | |
| "https://images.ctfassets.net/fzn2n1nzq965/21KQEBsC7QG4IYZV5RuhDz/d3180249af4082f42a22cb5f3ccc8e09/arc-texture-1.png", | |
| "https://images.ctfassets.net/fzn2n1nzq965/22Apsqcv7VIDzlCuSOEzPQ/2194c40aac8bced46d48582d5d712bf6/arc-texture-2.png", | |
| "https://images.ctfassets.net/fzn2n1nzq965/79YUdAMNjtlQuuFLN0RBLG/f779fbfcc31d6360893844a29ec5fb4f/arc-texture-3.png", | |
| "https://images.ctfassets.net/fzn2n1nzq965/7ez6kk9Dk9uuhgdRLFyhZX/220a177ca8529de208f8ae3cc3b10609/arc-texture-4.png", | |
| ], | |
| Qt = | |
| "https://images.ctfassets.net/fzn2n1nzq965/2wn0qc94lx6dbfTVt1vpuO/cf3e66080a3cddeb7275a8fefbca5134/disc_texture.png", | |
| xt = class { | |
| scene: Scene; | |
| eastCountryList: string[]; | |
| westCountryList: string[]; | |
| middleCountryList: string[]; | |
| liveCountryList: string[]; | |
| countryList: string[]; | |
| origin: Vector3; | |
| dom: Record<string, HTMLElement>; | |
| mouse: Vector2; | |
| isDragging: boolean; | |
| isStatic: boolean; | |
| isDiscTextureLoaded: boolean; | |
| arcTexturesLoaded: number; | |
| globeOff: boolean; | |
| scrollTop: number; | |
| globeOpacity: number; | |
| lineCount: number; | |
| currentLines: (typeof N)[]; | |
| arcColors: number[][]; | |
| globeRadius: number; | |
| globeSegments: number; | |
| isLoaded: boolean; | |
| loaded: string[]; | |
| loading: string[]; | |
| isScrolling: boolean; | |
| isRevealed: boolean; | |
| frame: number; | |
| oldRotationY: number; | |
| oldRotationX: number; | |
| newRotationY: number; | |
| newRotationX: number; | |
| globeRotationIncrement: number; | |
| targetScale: number; | |
| scale: number; | |
| oldMouseX: number; | |
| oldMouseY: number; | |
| moveX: number; | |
| moveY: number; | |
| tension: number; | |
| initialized: boolean; | |
| el: HTMLElement; | |
| setWindowSize: () => void; | |
| handleResize: () => void; | |
| handleDragStart: () => void; | |
| handleTouchStart: (t: TouchEvent) => void; | |
| handleMouseMove: (t: MouseEvent) => void; | |
| handleTouchMove: (t: TouchEvent) => void; | |
| handleMouseUp: () => void; | |
| handleMouseDown: (t: MouseEvent) => void; | |
| handleDragging: () => void; | |
| constructor(t: HTMLElement) { | |
| this.eastCountryList = ["my", "sg", "au", "nz", "hk", "jp", "in"]; | |
| this.westCountryList = ["ca", "mx", "us", "br"]; | |
| this.middleCountryList = [ | |
| "be", | |
| "gb", | |
| "at", | |
| "dk", | |
| "ee", | |
| "fi", | |
| "fr", | |
| "gr", | |
| "de", | |
| "ie", | |
| "it", | |
| "lv", | |
| "lt", | |
| "lu", | |
| "nl", | |
| "no", | |
| "pl", | |
| "pt", | |
| "es", | |
| "sk", | |
| "si", | |
| "se", | |
| "ch", | |
| "cy", | |
| "bg", | |
| "ro", | |
| "cz", | |
| ]; | |
| this.liveCountryList = [ | |
| ...this.eastCountryList, | |
| ...this.westCountryList, | |
| ...this.middleCountryList, | |
| ]; | |
| this.countryList = Object.keys(F); | |
| this.origin = new p(0, 0, 0); | |
| this.dom = {}; | |
| this.mouse = new T(); | |
| this.isDragging = !1; | |
| this.isStatic = !1; | |
| this.isDiscTextureLoaded = !1; | |
| this.arcTexturesLoaded = 0; | |
| this.globeOff = !1; | |
| this.scrollTop = 0; | |
| this.globeOpacity = 0; | |
| this.lineCount = 0; | |
| this.currentLines = []; | |
| this.arcColors = [ | |
| [16335176, 16763735], | |
| [11232234, 9494783], | |
| [16335176, 11232234], | |
| [16763735, 9494783], | |
| ]; | |
| this.scene = new et(); | |
| this.globeRadius = ft; | |
| this.globeSegments = kt; | |
| this.isLoaded = !1; | |
| this.loaded = []; | |
| this.loading = []; | |
| this.isScrolling = !1; | |
| this.isRevealed = !1; | |
| this.frame = 0; | |
| this.oldRotationY = 0; | |
| this.oldRotationX = 0; | |
| this.newRotationY = 0; | |
| this.newRotationX = 0; | |
| this.globeRotationIncrement = bt; | |
| this.targetScale = 1; | |
| this.scale = 1; | |
| this.oldMouseX = 0; | |
| this.oldMouseY = 0; | |
| this.moveX = 0; | |
| this.moveY = 0; | |
| this.tension = 1; | |
| this.initialized = !1; | |
| this.handleDragStart = () => { | |
| this.globeDots.startDragging(), | |
| (this.isDragging = !0), | |
| (this.oldRotationX = this.globeContainer.rotation.x), | |
| (this.oldRotationY = this.globeContainer.rotation.y), | |
| (this.targetScale = this.isStatic ? 1 : 0.98), | |
| document.documentElement.classList.add("is-globe-dragging"); | |
| }; | |
| this.handleTouchStart = (t) => { | |
| let e = t.touches[0] || t.changedTouches[0]; | |
| (this.oldMouseX = e.pageX), | |
| (this.oldMouseY = e.pageY), | |
| (this.mouse.x = e.pageX), | |
| (this.mouse.y = e.pageY), | |
| (this.touchStartX = e.pageX), | |
| (this.touchStartY = e.pageY), | |
| this.handleDragStart(); | |
| }; | |
| this.handleMouseMove = (t) => { | |
| (this.mouse.x = t.clientX), | |
| (this.mouse.y = t.clientY), | |
| this.handleDragging(); | |
| }; | |
| this.handleTouchMove = (t) => { | |
| let e = t.touches[0] || t.changedTouches[0]; | |
| (this.touchDistanceX = Math.abs(this.touchStartX - e.pageX)), | |
| (this.touchDistanceY = Math.abs(this.touchStartY - e.pageY)), | |
| !(this.touchDistanceY > this.touchDistanceX) && | |
| ((this.mouse.x = e.pageX), | |
| (this.mouse.y = e.pageY), | |
| this.handleDragging()); | |
| }; | |
| this.handleMouseUp = () => { | |
| setTimeout(() => { | |
| document.documentElement.classList.remove("is-globe-dragging"); | |
| }, 20), | |
| (this.isDragging = !1), | |
| (this.moveX !== 0 || Math.abs(this.moveY) > 0) && | |
| this.throwGlobe(this.moveX, this.moveY), | |
| (this.oldMouseX = 0), | |
| (this.oldMouseY = 0), | |
| (this.moveX = 0), | |
| (this.moveY = 0), | |
| (this.targetScale = 1), | |
| this.globeDots.stopDragging(); | |
| }; | |
| this.handleMouseDown = (t) => { | |
| document.documentElement.classList.add("is-globe-dragging"), | |
| (this.oldMouseX = t.clientX), | |
| (this.oldMouseY = t.clientY), | |
| this.handleDragStart(); | |
| }; | |
| this.handleDragging = () => { | |
| !this.isDragging || | |
| ((this.tension = 1 + Math.abs(this.oldRotationX)), | |
| (this.tension = G(this.tension, this.tension)), | |
| (this.moveX = (this.oldMouseX - this.mouse.x) * vt), | |
| (this.moveY = ((this.oldMouseY - this.mouse.y) * vt) / this.tension), | |
| (this.newRotationY = this.resetRevolutions( | |
| this.oldRotationY + this.moveX | |
| )), | |
| (this.newRotationX = Math.max( | |
| wt, | |
| Math.min(Mt, this.oldRotationX + this.moveY) | |
| )), | |
| (this.globeContainer.rotation.y = this.newRotationY), | |
| (this.globeContainer.rotation.x = this.newRotationX), | |
| (this.oldRotationY = this.newRotationY), | |
| (this.oldRotationX = this.newRotationX), | |
| (this.oldMouseX = this.mouse.x), | |
| (this.oldMouseY = this.mouse.y)); | |
| }; | |
| this.setWindowSize = () => { | |
| (this.windowW = this.el.clientWidth), | |
| (this.windowH = this.el.clientHeight), | |
| (this.aspectRatio = 1), | |
| this.renderer.setSize(this.windowW, this.windowH), | |
| (this.oldInnerWidth = this.windowW); | |
| }; | |
| this.handleResize = () => { | |
| let { clientWidth: t } = document.documentElement; | |
| (this.oldInnerWidth !== t || t > Bt) && | |
| (this.setWindowSize(), this.addCamera()); | |
| }; | |
| (this.el = t), this.load(); | |
| } | |
| load() { | |
| console.log("load"); | |
| this.loading.push("scene"); | |
| this.dom.container = this.el; | |
| this.isDotsOnly = this.el.dataset.globeType | |
| ? this.el.dataset.globeType === "dots" | |
| : !1; | |
| this.isLayers = this.el.dataset.globeType | |
| ? this.el.dataset.globeType === "layers" | |
| : !1; | |
| this.globeRadius = Math.min(this.el.clientWidth / 2 - 30, ft); | |
| console.log("this.globeRadius", this.globeRadius); | |
| this.addRenderer(); | |
| this.addLighting(); | |
| this.addGlobe(); | |
| return ( | |
| this.addListeners(), | |
| this.setWindowSize(), | |
| this.addCamera(), | |
| this.objectLoaded("scene"), | |
| this.play(), | |
| !0 | |
| ); | |
| } | |
| play() { | |
| console.log("play"); | |
| this.initialized | |
| ? (this.currentLines.forEach((t) => t.play()), this.drawLines()) | |
| : this.addLines(), | |
| (this.initialized && this.isStatic) || this.render(this.frame), | |
| (this.initialized = !0); | |
| } | |
| pause() { | |
| this.currentLines.forEach((t) => t.pause()), | |
| cancelAnimationFrame(this.renderAnimationFrame), | |
| clearInterval(this.lineInterval); | |
| } | |
| disconnect() { | |
| clearInterval(this.lineInterval), | |
| cancelAnimationFrame(this.renderAnimationFrame), | |
| cancelAnimationFrame(this.throwAnimationFrame), | |
| window.removeEventListener("resize", this.handleResize), | |
| !this.isStatic && | |
| (window.removeEventListener("mouseup", this.handleMouseUp), | |
| window.removeEventListener("mousemove", this.handleMouseMove), | |
| this.el.removeEventListener("touchstart", this.handleTouchStart), | |
| window.removeEventListener("touchmove", this.handleTouchMove), | |
| window.removeEventListener("touchend", this.handleMouseUp), | |
| this.el.removeEventListener("mousedown", this.handleMouseDown)); | |
| } | |
| setCountryList(t) { | |
| this.countryList = t; | |
| } | |
| addCamera() { | |
| let t = this.windowH * 0.5, | |
| e = -(this.aspectRatio * this.windowH) * 0.5, | |
| i = this.globeRadius * 4; | |
| this.camera || (this.camera = new $(0, 0, 0, 0, 0, 0)), | |
| (this.camera.left = e), | |
| (this.camera.right = -e), | |
| (this.camera.top = t), | |
| (this.camera.bottom = -t), | |
| (this.camera.near = -i), | |
| (this.camera.far = i), | |
| this.camera.updateProjectionMatrix(); | |
| } | |
| addRenderer() { | |
| console.log("addRenderer"); | |
| this.renderer = new tt({ | |
| antialias: !1, | |
| alpha: !0, | |
| }); | |
| this.renderer.setPixelRatio(window.devicePixelRatio); | |
| this.renderer.setClearColor(14540253, 0); | |
| this.renderer.sortObjects = !1; | |
| console.log( | |
| "this.dom.container", | |
| this.dom.container, | |
| this.renderer.domElement | |
| ); | |
| this.dom.container.appendChild(this.renderer.domElement); | |
| } | |
| addLighting() { | |
| let t = new ht(10086140, 1); | |
| this.scene.add(t); | |
| let e = new j(12775677, 2, 0, 2); | |
| e.position.set(-1e3, -1100, -3300), this.scene.add(e); | |
| let i = new j(10593711, 0.8, 0, 20); | |
| i.position.set(-3e3, 3e3, 3300), this.scene.add(i); | |
| } | |
| addGlobe() { | |
| (this.globeContainer = new y()), | |
| this.scene.add(this.globeContainer), | |
| this.addGlobeMap(), | |
| this.addGlobeDots(), | |
| this.addGlobeFill(), | |
| (this.globeContainer.position.z = -this.globeRadius * 2), | |
| (this.globeContainer.rotation.x = this.isDotsOnly ? Ft : Nt), | |
| (this.globeContainer.rotation.y = this.isStatic ? Yt : Pt); | |
| } | |
| addGlobeDots() { | |
| let t = this.isLayers | |
| ? this.globeRadius - this.globeRadius * 0.25 | |
| : this.globeRadius; | |
| this.loading.push("globeDots"), | |
| (this.globeDots = new P( | |
| t, | |
| () => { | |
| this.objectLoaded("globeDots"); | |
| }, | |
| this.isStatic, | |
| this.isDotsOnly | |
| )), | |
| this.globeMap.add(this.globeDots); | |
| } | |
| addGlobeFill() { | |
| this.globeFillMaterial = new nt({ | |
| transparent: !0, | |
| opacity: 1, | |
| color: 1056824, | |
| }); | |
| let t = this.isLayers | |
| ? this.globeRadius - this.globeRadius * 0.5 | |
| : this.globeRadius - 0.1; | |
| (this.globeFillSphere = new B(t, this.globeSegments, this.globeSegments)), | |
| (this.globeFill = new b(this.globeFillSphere, this.globeFillMaterial)), | |
| this.globeMap.add(this.globeFill); | |
| } | |
| addGlobeMap() { | |
| console.log("addGlobeMap"); | |
| console.log("this.globeContainer", this.globeContainer); | |
| (this.globeMap = new y()), this.globeContainer.add(this.globeMap); | |
| } | |
| throwGlobe(t, e) { | |
| let i = t * yt, | |
| o = e * yt, | |
| r = this.globeContainer.rotation.y + i, | |
| n = Math.max(wt, Math.min(Mt, this.globeContainer.rotation.x + o)); | |
| (this.globeContainer.rotation.y = this.resetRevolutions(r)), | |
| (this.globeContainer.rotation.x = n), | |
| (Math.abs(i) > 0.001 || Math.abs(o) > 0.001) && | |
| this.isDragging === !1 && | |
| (this.throwAnimationFrame = requestAnimationFrame(() => { | |
| this.throwGlobe(i, o); | |
| })); | |
| } | |
| addLines() { | |
| this.isDotsOnly || | |
| ((this.circleTexture = new W().load(Qt, () => { | |
| this.isDiscTextureLoaded = !0; | |
| })), | |
| (this.arcTextures = Lt.map((t) => | |
| new W().load(t, () => { | |
| this.arcTexturesLoaded += 1; | |
| }) | |
| )), | |
| (this.linesContainer = new y()), | |
| this.globeContainer.add(this.linesContainer), | |
| this.drawLines(), | |
| this.isLayers && | |
| ((this.globeOuterLayerMaterial = new at({ | |
| transparent: !0, | |
| opacity: 0.05, | |
| })), | |
| (this.globeOuterLayerSphere = new B( | |
| this.globeRadius, | |
| this.globeSegments, | |
| this.globeSegments | |
| )), | |
| (this.globeOuterLayer = new b( | |
| this.globeOuterLayerSphere, | |
| this.globeOuterLayerMaterial | |
| )), | |
| this.globeContainer.add(this.globeOuterLayer))); | |
| } | |
| drawLines() { | |
| if (!this.isStatic && !this.isDotsOnly) { | |
| clearInterval(this.lineInterval), | |
| (this.lineInterval = window.setInterval(() => { | |
| this.drawLine(); | |
| }, jt)); | |
| return; | |
| } | |
| if (this.lineCount === 0) for (let t = 0; t < Wt; t += 1) this.drawLine(); | |
| } | |
| drawLine() { | |
| this.lineCount += 1; | |
| let t = this.resetRevolutions(this.globeContainer.rotation.y), | |
| e = this.countryList[this.lineCount % this.countryList.length], | |
| i = this.liveCountryList[this.lineCount % this.liveCountryList.length]; | |
| if ( | |
| ((t < 5.7 && t > 4.4) || (t > -2 && t < -0.2) | |
| ? (i = | |
| this.eastCountryList[ | |
| this.lineCount % this.eastCountryList.length | |
| ]) | |
| : (t < 4.2 && t > 2.2) || (t > -4 && t < -1.7) | |
| ? (((t < -1.7 && t > -3) || (t > 3 && t < 4.2)) && | |
| (e = | |
| this.eastCountryList[ | |
| this.lineCount % this.eastCountryList.length | |
| ]), | |
| (i = | |
| this.westCountryList[ | |
| this.lineCount % this.westCountryList.length | |
| ])) | |
| : ((t < 2.2 && t > 0.3) || (t > -6.28 && t < -4)) && | |
| (i = | |
| this.middleCountryList[ | |
| this.lineCount % this.middleCountryList.length | |
| ]), | |
| e === i) | |
| ) { | |
| this.drawLine(); | |
| return; | |
| } | |
| let o = F[e], | |
| r = F[i], | |
| n = this.lineCount % this.arcColors.length, | |
| s = this.arcColors[n], | |
| h = new N( | |
| o, | |
| r, | |
| s, | |
| this.arcTextures[n], | |
| this.circleTexture, | |
| this.globeRadius * 1.001 + Math.random() * 0.01, | |
| this.isStatic | |
| ); | |
| this.linesContainer.add(h), | |
| this.currentLines.push(h), | |
| !this.isStatic && | |
| setTimeout(() => { | |
| this.hideLine(h); | |
| let d = this.currentLines.indexOf(h); | |
| d > -1 && this.currentLines.splice(d, 1); | |
| }, Ht); | |
| } | |
| hideLine(t) { | |
| t.hideLine(), | |
| setTimeout(() => { | |
| t.disposeLine(), this.linesContainer.remove(t); | |
| }, 1500); | |
| } | |
| objectLoaded(t = "x") { | |
| this.loaded.push(t), | |
| this.loaded.length === this.loading.length && (this.isLoaded = !0); | |
| } | |
| resetRevolutions(t) { | |
| if (Math.abs(t / J) === 0) return t; | |
| let e = Math.floor(Math.abs(t / J)) * Math.sign(t); | |
| return t - e * J; | |
| } | |
| addListeners() { | |
| window.addEventListener("resize", this.handleResize), | |
| !this.isStatic && | |
| (window.addEventListener("mouseup", this.handleMouseUp), | |
| window.addEventListener("mousemove", this.handleMouseMove), | |
| this.el.addEventListener("touchstart", this.handleTouchStart, { | |
| passive: !0, | |
| }), | |
| window.addEventListener("touchmove", this.handleTouchMove), | |
| window.addEventListener("touchend", this.handleMouseUp), | |
| this.el.addEventListener("mousedown", this.handleMouseDown)); | |
| } | |
| revealAnimation() { | |
| let t = this.isStatic ? 1 : z(this.globeOpacity, 0, 1, 1); | |
| (this.globeOpacity += qt), | |
| (this.globeFillMaterial.opacity = t * Ut), | |
| (this.globeRotationIncrement = (1 - t) * bt + Vt * t), | |
| t > 0.999 && (this.isRevealed = !0); | |
| } | |
| autoRotateGlobe() { | |
| this.isDragging || | |
| this.isScrolling || | |
| this.isStatic || | |
| (this.globeContainer.rotation.y -= this.globeRotationIncrement); | |
| } | |
| render(t = 0) { | |
| (this.frame = t), | |
| this.autoRotateGlobe(), | |
| Math.abs(this.scale - this.targetScale) > 0.001 && | |
| ((this.scale -= 0.1 * (this.scale - this.targetScale)), | |
| this.globeFill.scale.set(this.scale, this.scale, this.scale)), | |
| !this.globeOff && | |
| this.isLoaded && | |
| (this.globeDots.animate(), | |
| this.isRevealed || this.revealAnimation(), | |
| this.renderer.render(this.scene, this.camera)), | |
| (this.renderAnimationFrame = requestAnimationFrame(() => { | |
| if ( | |
| this.isRevealed && | |
| this.isStatic && | |
| this.arcTexturesLoaded === Lt.length && | |
| this.isDiscTextureLoaded | |
| ) { | |
| this.renderer.render(this.scene, this.camera); | |
| return; | |
| } | |
| this.render(t + 1); | |
| })); | |
| } | |
| }; | |
| export { xt as Globe }; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import { BlogGlobe } from "./stripe-globe-2"; | |
| export const useStripeGlobe = () => { | |
| let globeEl: HTMLElement | null = null; | |
| let globe: BlogGlobe | null = null; | |
| const checkAndInitGlobe = () => { | |
| if (typeof document === "undefined") return false; | |
| globeEl = document.querySelector('[data-js-controller="BlogGlobe"]'); | |
| if (globeEl) { | |
| globe = new BlogGlobe(globeEl); | |
| return true; | |
| } | |
| return false; | |
| }; | |
| const intervalId = setInterval(() => { | |
| if (checkAndInitGlobe()) { | |
| clearInterval(intervalId); | |
| } | |
| }, 100); | |
| return () => { | |
| clearInterval(intervalId); | |
| globe?.disconnect(); | |
| }; | |
| }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Well written! Any performance metrics?