//
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);
}