// var donateButton = document.getElementById('donateButton'); var card = document.getElementById('card'); donateButton.addEventListener('click', function(event) { event.stopPropagation(); if (card.classList.contains('card-out')) { card.classList.remove('card-out'); card.classList.add('card-in'); } else { card.classList.remove('card-in'); card.classList.add('card-out'); } }); window.addEventListener('click', function(event) { if(event.target === card || card.contains(event.target)) { return; } if (card.classList.contains('card-in')) { card.classList.remove('card-in'); card.classList.add('card-out'); } }); var cryptoWallets = [ { symbol: 'XMR', name: 'Monero', address: '49r2aeun8DtV5VqZpZSwRpS83WfUWEaLt4NG8HJwwVkbiT1vSsXTXrPFKkKTdc6MPX9iezbTidNPvhGZKCnM1338TfK6Hgi', }, { symbol: 'LTC', name: 'Litecoin', address: 'LRAm7h5XENknfYEpbdVsvyGY8D6MiXGTDV', }, { symbol: 'BTC', name: 'Bitcoin', address: 'bc1qkv97ajh7f0a72l9rsjd3fmmly5q5uywr06q3x0', } ]; var walletsContainer = document.getElementById('wallets'); var qrImage = document.getElementById('qrImage'); var donateTitle = document.getElementById('donateTitle'); var donateWarn = document.getElementById('donateWarn'); var walletAddress = document.getElementById('walletAddress'); var copyButton = document.getElementById('copyButton'); function selectWallet(symbol) { var wallet = cryptoWallets.find(function (w) { return w.symbol === symbol; }); if (!wallet) return; var buttons = Array.from(walletsContainer.children); buttons.forEach(function (button) { button.classList.remove('active'); if (button.textContent === symbol) { button.classList.add('active'); } }); qrImage.src = 'https://api.qrserver.com/v1/create-qr-code/?size=180x180&data=' + wallet.address; donateTitle.textContent = 'Donate ' + wallet.name; donateWarn.textContent = 'Send only ' + wallet.name + ' (' + wallet.symbol + ') to this deposit address. Sending any other coin or token to this address may result in the loss of your donation. Thanks!'; walletAddress.value = wallet.address; copyButton.textContent = '✚ Copy'; } function copyText() { var input = document.createElement('input'); document.body.appendChild(input); input.value = walletAddress.value; input.select(); document.execCommand('copy'); document.body.removeChild(input); copyButton.textContent = '✔ Copied'; } cryptoWallets.forEach(function (wallet) { var button = document.createElement('button'); button.textContent = wallet.symbol; button.addEventListener('click', function () { selectWallet(wallet.symbol); }); walletsContainer.appendChild(button); }); copyButton.addEventListener('click', copyText); selectWallet(cryptoWallets[0].symbol); // let globalUniforms = { time: { value: 0 } }; import * as THREE from "https://cdn.skypack.dev/three@0.136.0"; import { OrbitControls } from "https://cdn.skypack.dev/three@0.136.0/examples/jsm/controls/OrbitControls"; import { CSS2DRenderer, CSS2DObject } from 'https://cdn.skypack.dev/three@0.136.0/examples/jsm/renderers/CSS2DRenderer.js'; let scene = new THREE.Scene(); let camera = new THREE.PerspectiveCamera(45, innerWidth / innerHeight, 1, 2000); camera.position.set(-5, 4, -0.8).setLength(14); let renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(innerWidth, innerHeight); renderer.setClearColor(0x241917); document.body.appendChild(renderer.domElement); let labelRenderer = new CSS2DRenderer(); labelRenderer.setSize(window.innerWidth, window.innerHeight); labelRenderer.domElement.style.position = 'absolute'; labelRenderer.domElement.style.top = '0px'; document.body.appendChild(labelRenderer.domElement); window.addEventListener("resize", onWindowResize); let controls = new OrbitControls(camera, labelRenderer.domElement); controls.enablePan = false; controls.minDistance = 8; controls.maxDistance = 10; controls.enableDamping = true; controls.autoRotate = false; // let counter = 200000; let rad = 5; let sph = new THREE.Spherical(); let r = 0; let dlong = Math.PI * (3 - Math.sqrt(5)); let dz = 2 / counter; let long = 0; let z = 1 - dz / 2; let pts = []; let clr = []; let c = new THREE.Color(); let uvs = []; for (let i = 0; i < counter; i++) { r = Math.sqrt(1 - z * z); let p = new THREE.Vector3( Math.cos(long) * r, z, -Math.sin(long) * r ).multiplyScalar(rad); pts.push(p); z = z - dz; long = long + dlong; c.setHSL(0.45, 0.5, Math.random() * 0.25 + 0.25); c.toArray(clr, i * 3); sph.setFromVector3(p); uvs.push((sph.theta + Math.PI) / (Math.PI * 2), 1.0 - sph.phi / Math.PI); } let g = new THREE.BufferGeometry().setFromPoints(pts); g.setAttribute("color", new THREE.Float32BufferAttribute(clr, 3)); g.setAttribute("uv", new THREE.Float32BufferAttribute(uvs, 2)); let m = new THREE.PointsMaterial({ size: 0.1, vertexColors: false, color: new THREE.Color(0x743c2f), onBeforeCompile: (shader) => { shader.uniforms.globeTexture = { value: new THREE.TextureLoader().load(imgData) }; shader.vertexShader = ` uniform sampler2D globeTexture; varying float vVisibility; varying vec3 vNormal; varying vec3 vMvPosition; ${shader.vertexShader} `.replace( `gl_PointSize = size;`, ` vVisibility = texture(globeTexture, uv).g; gl_PointSize = size * (vVisibility < 0.5 ? 1. : 0.75); vNormal = normalMatrix * normalize(position); vMvPosition = -mvPosition.xyz; gl_PointSize *= 0.4 + (dot(normalize(vMvPosition), vNormal) * 0.6); ` ); shader.fragmentShader = ` varying float vVisibility; varying vec3 vNormal; varying vec3 vMvPosition; ${shader.fragmentShader} `.replace( `vec4 diffuseColor = vec4( diffuse, opacity );`, ` bool circ = length(gl_PointCoord - 0.5) > 0.5; bool vis = dot(vMvPosition, vNormal) < 0.; if (circ || vis) discard; vec3 col = diffuse + (vVisibility > 0.5 ? 0.5 : 0.); vec4 diffuseColor = vec4( col, opacity );` ); } }); let globe = new THREE.Points(g, m); scene.add(globe); // // let clock = new THREE.Clock(); renderer.setAnimationLoop(() => { let t = clock.getElapsedTime(); globalUniforms.time.value = t; controls.update(); renderer.render(scene, camera); labelRenderer.render(scene, camera); }); function onWindowResize() { camera.aspect = innerWidth / innerHeight; camera.updateProjectionMatrix(); renderer.setSize(innerWidth, innerHeight); labelRenderer.setSize(innerWidth, innerHeight); }