Help
RSS
API
Feed
Maltego
Contact
Domain > 3b3t.org
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-06-20
50.114.4.106
(
ClassC
)
2025-12-08
172.67.189.168
(
ClassC
)
Port 80
HTTP/1.1 200 OKDate: Mon, 08 Dec 2025 03:12:24 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveServer: cloudflareLast-Modified: Sat, 30 Aug 2025 19:58:45 GMTNel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}vary: accept-encodingReport-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sk6GO5IvbzwMcTwhZW9PTvFqBijR40RJTMBUysJDjLl6gOjQ2gaqtJwOalN9K69rGg85r5ZHooxc9UPfD4NjhYzRsSet%2FcbJx}}cf-cache-status: DYNAMICCF-RAY: 9aa914b38babe6e0-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html langru>head> meta charsetUTF-8> meta nameviewport contentwidthdevice-width, initial-scale1.0> title>MEGA/title> style> * { margin: 0; padding: 0; box-sizing: border-box; } body, html { height: 100vh; overflow: hidden; background: #000; font-family: Inter, -apple-system, BlinkMacSystemFont, sans-serif; } .darkveil-canvas { width: 100%; height: 100%; display: block; position: absolute; top: 0; left: 0; } .content { position: absolute; z-index: 10; top: 40%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 50vh; pointer-events: auto; overflow: hidden; } #canvas3d { width: 100%; height: 100%; border: none; border-radius: 12px; position: relative; top: 0; display: block; clip-path: inset(0 0 20% 0); } /style>/head> body> canvas iddarkVeilCanvas classdarkveil-canvas>/canvas> div classcontent> canvas idcanvas3d>/canvas> /div> script> class DarkVeil { constructor(canvas, options {}) { document.addEventListener(visibilitychange, this.handleVisibility); window.addEventListener(pagehide, () > this.destroy()); this.canvas canvas; this.gl canvas.getContext(webgl, { alpha: false, antialias: false, depth: false, stencil: false, preserveDrawingBuffer: false, powerPreference: high-performance }) || canvas.getContext(experimental-webgl); if (!this.gl) { console.error(WebGL not supported); return; } // Сразу выключим то, что не нужно const gl this.gl; gl.disable(gl.DITHER); gl.disable(gl.DEPTH_TEST); gl.disable(gl.STENCIL_TEST); gl.disable(gl.BLEND); this.options { hueShift: options.hueShift || 0, noiseIntensity: options.noiseIntensity || 0, scanlineIntensity: options.scanlineIntensity || 0, speed: options.speed || 0.5, scanlineFrequency: options.scanlineFrequency || 0, warpAmount: options.warpAmount || 0, resolutionScale: options.resolutionScale || 1, whiteMode: options.whiteMode || false }; this.dynamicScale true; this.resolutionScale this.options.resolutionScale || 0.5; this.minScale 0.25; this.maxScale 1.0; this._avgFrame 0; this.startTime performance.now(); this.frame null; this.init(); this.resize(); this.loop(); window.addEventListener(resize, () > this.resize()); } init() { const gl this.gl; // Vertex shader const vertexShaderSource ` attribute vec2 position; void main(){ gl_Position vec4(position, 0.0, 1.0); } `; // Fragment shader (оригинальный из ReactBits) const fragmentShaderSource ` #ifdef GL_ES precision lowp float; #endif uniform vec2 uResolution; uniform float uTime; uniform float uHueShift; uniform float uNoise; uniform float uScan; uniform float uScanFreq; uniform float uWarp; uniform float uWhiteMode; #define iTime uTime #define iResolution uResolution vec4 buf8; float rand(vec2 c){return fract(sin(dot(c,vec2(12.9898,78.233)))*43758.5453);} mat3 rgb2yiqmat3(0.299,0.587,0.114,0.596,-0.274,-0.322,0.211,-0.523,0.312); mat3 yiq2rgbmat3(1.0,0.956,0.621,1.0,-0.272,-0.647,1.0,-1.106,1.703); vec3 hueShiftRGB(vec3 col,float deg){ vec3 yiqrgb2yiq*col; float radradians(deg); float coshcos(rad),sinhsin(rad); vec3 yiqShiftvec3(yiq.x,yiq.y*cosh-yiq.z*sinh,yiq.y*sinh+yiq.z*cosh); return clamp(yiq2rgb*yiqShift,0.0,1.0); } vec4 sigmoid(vec4 x){return 1./(1.+exp(-x));} vec4 cppn_fn(vec2 coordinate,float in0,float in1,float in2){ buf6vec4(coordinate.x,coordinate.y,0.3948333106474662+in0,0.36+in1); buf7vec4(0.14+in2,sqrt(coordinate.x*coordinate.x+coordinate.y*coordinate.y),0.,0.); buf0mat4(vec4(6.5404263,-3.6126034,0.7590882,-1.13613),vec4(2.4582713,3.1660357,1.2219609,0.06276096),vec4(-5.478085,-6.159632,1.8701609,-4.7742867),vec4(6.039214,-5.542865,-0.90925294,3.251348))*buf6+mat4(vec4(0.8473259,-5.722911,3.975766,1.6522468),vec4(-0.24321538,0.5839259,-1.7661959,-5.350116),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf7+vec4(0.21808943,1.1243913,-1.7969975,5.0294676); buf1mat4(vec4(-3.3522482,-6.0612736,0.55641043,-4.4719114),vec4(0.8631464,1.7432913,5.643898,1.6106541),vec4(2.4941394,-3.5012043,1.7184316,6.357333),vec4(3.310376,8.209261,1.1355612,-1.165539))*buf6+mat4(vec4(5.24046,-13.034365,0.009859298,15.870829),vec4(2.987511,3.129433,-0.89023495,-1.6822904),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf7+vec4(-5.9457836,-6.573602,-0.8812491,1.5436668); buf0sigmoid(buf0);buf1sigmoid(buf1); buf2mat4(vec4(-15.219568,8.095543,-2.429353,-1.9381982),vec4(-5.951362,4.3115187,2.6393783,1.274315),vec4(-7.3145227,6.7297835,5.2473326,5.9411426),vec4(5.0796127,8.979051,-1.7278991,-1.158976))*buf6+mat4(vec4(-11.967154,-11.608155,6.1486754,11.237008),vec4(2.124141,-6.263192,-1.7050359,-0.7021966),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf7+vec4(-4.17164,-3.2281182,-4.576417,-3.6401186); buf3mat4(vec4(3.1832156,-13.738922,1.879223,3.233465),vec4(0.64300746,12.768129,1.9141049,0.50990224),vec4(-0.049295485,4.4807224,1.4733979,1.801449),vec4(5.0039253,13.000481,3.3991797,-4.5561905))*buf6+mat4(vec4(-0.1285731,7.720628,-3.1425676,4.742367),vec4(0.6393625,3.714393,-0.8108378,-0.39174938),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf7+vec4(-1.1811101,-21.621881,0.7851888,1.2329718); buf2sigmoid(buf2);buf3sigmoid(buf3); buf4mat4(vec4(5.214916,-7.183024,2.7228765,2.6592617),vec4(-5.601878,-25.3591,4.067988,0.4602802),vec4(-10.57759,24.286327,21.102104,37.546658),vec4(4.3024497,-1.9625226,2.3458803,-1.372816))*buf0+mat4(vec4(-17.6526,-10.507558,2.2587414,12.462782),vec4(6.265566,-502.75443,-12.642513,0.9112289),vec4(-10.983244,20.741234,-9.701768,-0.7635988),vec4(5.383626,1.4819539,-4.1911616,-4.8444734))*buf1+mat4(vec4(12.785233,-16.345072,-0.39901125,1.7955981),vec4(-30.48365,-1.8345358,1.4542528,-1.1118771),vec4(19.872723,-7.337935,-42.941723,-98.52709),vec4(8.337645,-2.7312303,-2.2927687,-36.142323))*buf2+mat4(vec4(-16.298317,3.5471997,-0.44300047,-9.444417),vec4(57.5077,-35.609753,16.163465,-4.1534753),vec4(-0.07470326,-3.8656476,-7.0901804,3.1523974),vec4(-12.559385,-7.077619,1.490437,-0.8211543))*buf3+vec4(-7.67914,15.927437,1.3207729,-1.6686112); buf5mat4(vec4(-1.4109162,-0.372762,-3.770383,-21.367174),vec4(-6.2103205,-9.35908,0.92529047,8.82561),vec4(11.460242,-22.348068,13.625772,-18.693201),vec4(-0.3429052,-3.9905605,-2.4626114,-0.45033523))*buf0+mat4(vec4(7.3481627,-4.3661838,-6.3037653,-3.868115),vec4(1.5462853,6.5488915,1.9701879,-0.58291394),vec4(6.5858274,-2.2180402,3.7127688,-1.3730392),vec4(-5.7973905,10.134961,-2.3395722,-5.965605))*buf1+mat4(vec4(-2.5132585,-6.6685553,-1.4029363,-0.16285264),vec4(-0.37908727,0.53738135,4.389061,-1.3024765),vec4(-0.70647055,2.0111287,-5.1659346,-3.728635),vec4(-13.562562,10.487719,-0.9173751,-2.6487076))*buf2+mat4(vec4(-8.645013,6.5546675,-6.3944063,-5.5933375),vec4(-0.57783127,-1.077275,36.91025,5.736769),vec4(14.283112,3.7146652,7.1452246,-4.5958776),vec4(2.7192075,3.6021907,-4.366337,-2.3653464))*buf3+vec4(-5.9000807,-4.329569,1.2427121,8.59503); buf4sigmoid(buf4);buf5sigmoid(buf5); buf6mat4(vec4(-1.61102,0.7970257,1.4675229,0.20917463),vec4(-28.793737,-7.1390953,1.5025433,4.656581),vec4(-10.94861,39.66238,0.74318546,-10.095605),vec4(-0.7229728,-1.5483948,0.7301322,2.1687684))*buf0+mat4(vec4(3.2547753,21.489103,-1.0194173,-3.3100595),vec4(-3.7316632,-3.3792162,-7.223193,-0.23685838),vec4(13.1804495,0.7916005,5.338587,5.687114),vec4(-4.167605,-17.798311,-6.815736,-1.6451967))*buf1+mat4(vec4(0.604885,-7.800309,-7.213122,-2.741014),vec4(-3.522382,-0.12359311,-0.5258442,0.43852118),vec4(9.6752825,-22.853785,2.062431,0.099892326),vec4(-4.3196306,-17.730087,2.5184598,5.30267))*buf2+mat4(vec4(-6.545563,-15.790176,-6.0438633,-5.415399),vec4(-43.591583,28.551912,-16.00161,18.84728),vec4(4.212382,8.394307,3.0958717,8.657522),vec4(-5.0237565,-4.450633,-4.4768,-5.5010443))*buf3+mat4(vec4(1.6985557,-67.05806,6.897715,1.9004834),vec4(1.8680354,2.3915145,2.5231109,4.081538),vec4(11.158006,1.7294737,2.0738268,7.386411),vec4(-4.256034,-306.24686,8.258898,-17.132736))*buf4+mat4(vec4(1.6889864,-4.5852966,3.8534803,-6.3482175),vec4(1.3543309,-1.2640043,9.932754,2.9079645),vec4(-5.2770967,0.07150358,-0.13962056,3.3269649),vec4(28.34703,-4.918278,6.1044083,4.085355))*buf5+vec4(6.6818056,12.522166,-3.7075126,-4.104386); buf7mat4(vec4(-8.265602,-4.7027016,5.098234,0.7509808),vec4(8.6507845,-17.15949,16.51939,-8.884479),vec4(-4.036479,-2.3946867,-2.6055532,-1.9866527),vec4(-2.2167742,-1.8135649,-5.9759874,4.8846445))*buf0+mat4(vec4(6.7790847,3.5076547,-2.8191125,-2.7028968),vec4(-5.743024,-0.27844876,1.4958696,-5.0517144),vec4(13.122226,15.735168,-2.9397483,-4.101023),vec4(-14.375265,-5.030483,-6.2599335,2.9848232))*buf1+mat4(vec4(4.0950394,-0.94011575,-5.674733,4.755022),vec4(4.3809423,4.8310084,1.7425908,-3.437416),vec4(2.117492,0.16342592,-104.56341,16.949184),vec4(-5.22543,-2.994248,3.8350096,-1.9364246))*buf2+mat4(vec4(-5.900337,1.7946124,-13.604192,-3.8060522),vec4(6.6583457,31.911177,25.164474,91.81147),vec4(11.840538,4.1503043,-0.7314397,6.768467),vec4(-6.3967767,4.034772,6.1714606,-0.32874924))*buf3+mat4(vec4(3.4992442,-196.91893,-8.923708,2.8142626),vec4(3.4806502,-3.1846354,5.1725626,5.1804223),vec4(-2.4009497,15.585794,1.2863957,2.0252278),vec4(-71.25271,-62.441242,-8.138444,0.50670296))*buf4+mat4(vec4(-12.291733,-11.176166,-7.3474145,4.390294),vec4(10.805477,5.6337385,-0.9385842,-4.7348723),vec4(-12.869276,-7.039391,5.3029537,7.5436664),vec4(1.4593618,8.91898,3.5101583,5.840625))*buf5+vec4(2.2415268,-6.705987,-0.98861027,-2.117676); buf6sigmoid(buf6);buf7sigmoid(buf7); buf0mat4(vec4(1.6794263,1.3817469,2.9625452,0.),vec4(-1.8834411,-1.4806935,-3.5924516,0.),vec4(-1.3279216,-1.0918057,-2.3124623,0.),vec4(0.2662234,0.23235129,0.44178495,0.))*buf0+mat4(vec4(-0.6299101,-0.5945583,-0.9125601,0.),vec4(0.17828953,0.18300213,0.18182953,0.),vec4(-2.96544,-2.5819945,-4.9001055,0.),vec4(1.4195864,1.1868085,2.5176322,0.))*buf1+mat4(vec4(-1.2584374,-1.0552157,-2.1688404,0.),vec4(-0.7200217,-0.52666044,-1.438251,0.),vec4(0.15345335,0.15196142,0.272854,0.),vec4(0.945728,0.8861938,1.2766753,0.))*buf2+mat4(vec4(-2.4218085,-1.968602,-4.35166,0.),vec4(-22.683098,-18.0544,-41.954372,0.),vec4(0.63792,0.5470648,1.1078634,0.),vec4(-1.5489894,-1.3075932,-2.6444845,0.))*buf3+mat4(vec4(-0.49252132,-0.39877754,-0.91366625,0.),vec4(0.95609266,0.7923952,1.640221,0.),vec4(0.30616966,0.15693925,0.8639857,0.),vec4(1.1825981,0.94504964,2.176963,0.))*buf4+mat4(vec4(0.35446745,0.3293795,0.59547555,0.),vec4(-0.58784515,-0.48177817,-1.0614829,0.),vec4(2.5271258,1.9991658,4.6846647,0.),vec4(0.13042648,0.08864098,0.30187556,0.))*buf5+mat4(vec4(-1.7718065,-1.4033192,-3.3355875,0.),vec4(3.1664357,2.638297,5.378702,0.),vec4(-3.1724713,-2.6107926,-5.549295,0.),vec4(-2.851368,-2.249092,-5.3013067,0.))*buf6+mat4(vec4(1.5203838,1.2212278,2.8404984,0.),vec4(1.5210563,1.2651345,2.683903,0.),vec4(2.9789467,2.4364579,5.2347264,0.),vec4(2.2270417,1.8825914,3.8028636,0.))*buf7+vec4(-1.5468478,-3.6171484,0.24762098,0.); buf0sigmoid(buf0); return vec4(buf0.x,buf0.y,buf0.z,1.); } void mainImage(out vec4 fragColor,in vec2 fragCoord){ vec2 uvfragCoord/uResolution.xy*2.-1.; uv.y*-1.; // Корректируем aspect ratio float aspect uResolution.x / uResolution.y; if (aspect > 1.0) { uv.x * aspect; } else { uv.y / aspect; } uv+uWarp*vec2(sin(uv.y*6.283+uTime*0.5),cos(uv.x*6.283+uTime*0.5))*0.05; fragColorcppn_fn(uv,0.1*sin(0.3*uTime),0.1*sin(0.69*uTime),0.1*sin(0.44*uTime)); } void main(){ vec4 col;mainImage(col,gl_FragCoord.xy); col.rgbhueShiftRGB(col.rgb,uHueShift); // Белый режим if (uWhiteMode > 0.5) { float gray dot(col.rgb, vec3(0.299, 0.587, 0.114)); col.rgb vec3(gray * 2.0); // Усиливаем яркость для белого } float scanline_valsin(gl_FragCoord.y*uScanFreq)*0.5+0.5; col.rgb*1.-(scanline_val*scanline_val)*uScan; col.rgb+(rand(gl_FragCoord.xy+uTime)-0.5)*uNoise; gl_FragColorvec4(clamp(col.rgb,0.0,1.0),1.0); } `; // Создаем шейдеры const vertexShader this.createShader(gl, gl.VERTEX_SHADER, vertexShaderSource); const fragmentShader this.createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource); // Создаем программу this.program this.createProgram(gl, vertexShader, fragmentShader); // Получаем расположения this.positionAttributeLocation gl.getAttribLocation(this.program, position); this.timeUniformLocation gl.getUniformLocation(this.program, uTime); this.resolutionUniformLocation gl.getUniformLocation(this.program, uResolution); this.hueShiftUniformLocation gl.getUniformLocation(this.program, uHueShift); this.noiseUniformLocation gl.getUniformLocation(this.program, uNoise); this.scanUniformLocation gl.getUniformLocation(this.program, uScan); this.scanFreqUniformLocation gl.getUniformLocation(this.program, uScanFreq); this.warpUniformLocation gl.getUniformLocation(this.program, uWarp); this.whiteModeUniformLocation gl.getUniformLocation(this.program, uWhiteMode); // Создаем треугольник (полный экран) this.positionBuffer gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array( -1, -1, 3, -1, -1, 3 ), gl.STATIC_DRAW); } createShader(gl, type, source) { const shader gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { console.error(Shader compilation error:, gl.getShaderInfoLog(shader)); gl.deleteShader(shader); return null; } return shader; } handleVisibility () > { if (document.hidden) { if (this.frame) cancelAnimationFrame(this.frame); this.frame null; } else if (!this.frame) { this._lastTs 0; this.frame requestAnimationFrame((t) > this.loop(t)); } }; createProgram(gl, vertexShader, fragmentShader) { const program gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { console.error(Program linking error:, gl.getProgramInfoLog(program)); gl.deleteProgram(program); return null; } return program; } resize() { const w window.innerWidth; const h window.innerHeight; const scale this.resolutionScale; const cw Math.max(1, (w * scale) | 0); const ch Math.max(1, (h * scale) | 0); if (this.canvas.width ! cw || this.canvas.height ! ch) { this.canvas.width cw; this.canvas.height ch; } this.canvas.style.width w + px; this.canvas.style.height h + px; this.gl.viewport(0, 0, cw, ch); } loop(ts performance.now()) { const gl this.gl; // кап FPS const dt ts - this._lastTs; if (dt this.minFrameInterval) { this.frame requestAnimationFrame((t) > this.loop(t)); return; } this._lastTs ts; const currentTime ((ts - this.startTime) / 1000) * this.options.speed; gl.viewport(0, 0, this.canvas.width, this.canvas.height); gl.clearColor(0, 0, 0, 1); gl.clear(gl.COLOR_BUFFER_BIT); gl.useProgram(this.program); gl.uniform1f(this.timeUniformLocation, currentTime); gl.uniform2f(this.resolutionUniformLocation, this.canvas.width, this.canvas.height); gl.uniform1f(this.hueShiftUniformLocation, this.options.hueShift); gl.uniform1f(this.noiseUniformLocation, this.options.noiseIntensity); gl.uniform1f(this.scanUniformLocation, this.options.scanlineIntensity); gl.uniform1f(this.scanFreqUniformLocation, this.options.scanlineFrequency); gl.uniform1f(this.warpUniformLocation, this.options.warpAmount); gl.uniform1f(this.whiteModeUniformLocation, this.options.whiteMode ? 1.0 : 0.0); gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer); gl.enableVertexAttribArray(this.positionAttributeLocation); gl.vertexAttribPointer(this.positionAttributeLocation, 2, gl.FLOAT, false, 0, 0); gl.drawArrays(gl.TRIANGLES, 0, 3); this.frame requestAnimationFrame((t) > this.loop(t)); } destroy() { if (this.frame) { cancelAnimationFrame(this.frame); } } } // Глобальная переменная для управления let darkVeilInstance null; let backgroundOpacity 1.0; let splineViewY 0; let opacityAnimationFrame null; let positionAnimationFrame null; // Доступные методы для Android: // enableBack() - выключает фон с анимацией 0.25 сек // disableBack() - включает фон с анимацией 0.25 сек // moveUp() - поднимает Spline view на 30% вверх с анимацией 0.25 сек // moveDown() - возвращает Spline view в исходную позицию с анимацией 0.25 сек // Функции для управления из Android function setWhiteMode(enabled) { if (darkVeilInstance) { darkVeilInstance.options.whiteMode enabled; } } // Методы для управления фоном // enableBack() - мгновенно выключает фон с анимацией альфа 0.25 сек function enableBack() { if (darkVeilInstance && darkVeilInstance.canvas) { animateOpacity(0.0, 0.25); } } // disableBack() - мгновенно включает фон с анимацией альфа 0.25 сек function disableBack() { if (darkVeilInstance && darkVeilInstance.canvas) { animateOpacity(1.0, 0.25); } } // Анимация прозрачности фона function animateOpacity(targetOpacity, duration) { const startOpacity backgroundOpacity; const startTime performance.now(); function updateOpacity(currentTime) { const elapsed (currentTime - startTime) / 1000; const progress Math.min(elapsed / duration, 1.0); // Интерполяция easeOut const easeOutProgress 1 - Math.pow(1 - progress, 3); backgroundOpacity startOpacity + (targetOpacity - startOpacity) * easeOutProgress; if (darkVeilInstance && darkVeilInstance.canvas) { darkVeilInstance.canvas.style.opacity backgroundOpacity; } if (progress 1.0) { opacityAnimationFrame requestAnimationFrame(updateOpacity); } } if (opacityAnimationFrame) { cancelAnimationFrame(opacityAnimationFrame); } opacityAnimationFrame requestAnimationFrame(updateOpacity); } // Методы для управления позицией Spline view // moveUp() - поднимает Spline view на 30% вверх с анимацией easeOut за 0.25 сек function moveUp() { animateSplinePosition(-23, 0.25); } // moveDown() - возвращает Spline view в исходную позицию с анимацией easeOut за 0.25 сек function moveDown() { animateSplinePosition(0, 0.25); } // Анимация позиции Spline view function animateSplinePosition(targetY, duration) { const startY splineViewY; const startTime performance.now(); function updatePosition(currentTime) { const elapsed (currentTime - startTime) / 1000; const progress Math.min(elapsed / duration, 1.0); // Интерполяция easeOut const easeOutProgress 1 - Math.pow(1 - progress, 3); splineViewY startY + (targetY - startY) * easeOutProgress; const contentElement document.querySelector(.content); if (contentElement) { // Начальная позиция -50% по Y, добавляем смещение const finalY -50 + splineViewY; contentElement.style.transform `translate(-50%, ${finalY}%)`; } if (progress 1.0) { positionAnimationFrame requestAnimationFrame(updatePosition); } } if (positionAnimationFrame) { cancelAnimationFrame(positionAnimationFrame); } positionAnimationFrame requestAnimationFrame(updatePosition); } function toggleWhiteMode() { if (darkVeilInstance) { darkVeilInstance.options.whiteMode !darkVeilInstance.options.whiteMode; } } function isWhiteMode() { return darkVeilInstance ? darkVeilInstance.options.whiteMode : false; } // Переменная для хранения Spline приложения let splineApp null; // Функция для генерации рандомного хеша function generateRandomHash() { return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); } // Функции для управления Spline переменными connected/disconnected function setConnected() { if (splineApp) { try { const hash generateRandomHash(); console.log(Setting connected to:, hash); splineApp.setVariable(connected, hash); } catch (e) { console.log(Error setting connected variable:, e); } } else { console.log(Spline app not loaded yet); } } function setDisconnected() { if (splineApp) { try { const hash generateRandomHash(); console.log(Setting disconnected to:, hash); splineApp.setVariable(disconnected, hash); } catch (e) { console.log(Error setting disconnected variable:, e); } } else { console.log(Spline app not loaded yet); } } function connectSpline() { console.log(Connecting Spline...); setConnected(); window.splineConnected true; } function disconnectSpline() { console.log(Disconnecting Spline...); setDisconnected(); window.splineConnected false; } function toggleSplineConnection() { window.splineConnected !window.splineConnected; if (window.splineConnected) { setConnected(); } else { setDisconnected(); } } // Инициализируем состояние window.splineConnected false; // Загружаем Spline Runtime и сцену async function loadSpline() { try { // Подключаем Spline Runtime const script document.createElement(script); script.type module; script.textContent ` import { Application } from /script.js; const canvas document.getElementById(canvas3d); const app new Application(canvas); // Загружаем сцену await app.load(${window.location.origin}/scene.splinecode); // Сохраняем приложение в глобальной переменной window.splineApp app; console.log(Spline app loaded successfully:, app); // Уведомляем Android о загрузке Spline if (typeof AndroidInterface ! undefined) { AndroidInterface.onSplineLoaded(); } // Устанавливаем начальные состояния переменных setTimeout(() > { try { app.setVariable(disconnected, ); console.log(Initial variables set); } catch (e) { console.log(Error setting initial variables:, e); } }, 1000); `; document.head.appendChild(script); // Ждем загрузки const checkApp setInterval(() > { if (window.splineApp) { splineApp window.splineApp; clearInterval(checkApp); console.log(Spline app ready); } }, 100); } catch (error) { console.error(Error loading Spline:, error); // Уведомляем Android об ошибке if (typeof AndroidInterface ! undefined) { AndroidInterface.onSplineError(error.toString()); } } } // Запускаем загрузку Spline loadSpline(); setWhiteMode(true); // Инициализация document.addEventListener(DOMContentLoaded, function() { const canvas document.getElementById(darkVeilCanvas); darkVeilInstance new DarkVeil(canvas, { hueShift: 0, noiseIntensity: 0.02, scanlineIntensity: 0, speed: 0.5, scanlineFrequency: 0, warpAmount: 0.1, resolutionScale: 0.5, whiteMode: false }); // Предотвращаем скролл на мобильных document.addEventListener(touchmove, function(e) { e.preventDefault(); }, { passive: false }); }); /script>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Mon, 08 Dec 2025 03:12:24 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveServer: cloudflareLast-Modified: Sat, 30 Aug 2025 19:58:45 GMTNel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}vary: accept-encodingReport-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?s0QPKhnWkb%2Fi6QUHEDd261Cm9HBur531OiXRuTfSQ0HUiLoh72uzKOz5SjVmDmZ7C6ZUj74YO7LCGr2Vd8hGZyOia7e6JkA%3D%3D}}cf-cache-status: DYNAMICCF-RAY: 9aa914b75a12ff02-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html langru>head> meta charsetUTF-8> meta nameviewport contentwidthdevice-width, initial-scale1.0> title>MEGA/title> style> * { margin: 0; padding: 0; box-sizing: border-box; } body, html { height: 100vh; overflow: hidden; background: #000; font-family: Inter, -apple-system, BlinkMacSystemFont, sans-serif; } .darkveil-canvas { width: 100%; height: 100%; display: block; position: absolute; top: 0; left: 0; } .content { position: absolute; z-index: 10; top: 40%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 50vh; pointer-events: auto; overflow: hidden; } #canvas3d { width: 100%; height: 100%; border: none; border-radius: 12px; position: relative; top: 0; display: block; clip-path: inset(0 0 20% 0); } /style>/head> body> canvas iddarkVeilCanvas classdarkveil-canvas>/canvas> div classcontent> canvas idcanvas3d>/canvas> /div> script> class DarkVeil { constructor(canvas, options {}) { document.addEventListener(visibilitychange, this.handleVisibility); window.addEventListener(pagehide, () > this.destroy()); this.canvas canvas; this.gl canvas.getContext(webgl, { alpha: false, antialias: false, depth: false, stencil: false, preserveDrawingBuffer: false, powerPreference: high-performance }) || canvas.getContext(experimental-webgl); if (!this.gl) { console.error(WebGL not supported); return; } // Сразу выключим то, что не нужно const gl this.gl; gl.disable(gl.DITHER); gl.disable(gl.DEPTH_TEST); gl.disable(gl.STENCIL_TEST); gl.disable(gl.BLEND); this.options { hueShift: options.hueShift || 0, noiseIntensity: options.noiseIntensity || 0, scanlineIntensity: options.scanlineIntensity || 0, speed: options.speed || 0.5, scanlineFrequency: options.scanlineFrequency || 0, warpAmount: options.warpAmount || 0, resolutionScale: options.resolutionScale || 1, whiteMode: options.whiteMode || false }; this.dynamicScale true; this.resolutionScale this.options.resolutionScale || 0.5; this.minScale 0.25; this.maxScale 1.0; this._avgFrame 0; this.startTime performance.now(); this.frame null; this.init(); this.resize(); this.loop(); window.addEventListener(resize, () > this.resize()); } init() { const gl this.gl; // Vertex shader const vertexShaderSource ` attribute vec2 position; void main(){ gl_Position vec4(position, 0.0, 1.0); } `; // Fragment shader (оригинальный из ReactBits) const fragmentShaderSource ` #ifdef GL_ES precision lowp float; #endif uniform vec2 uResolution; uniform float uTime; uniform float uHueShift; uniform float uNoise; uniform float uScan; uniform float uScanFreq; uniform float uWarp; uniform float uWhiteMode; #define iTime uTime #define iResolution uResolution vec4 buf8; float rand(vec2 c){return fract(sin(dot(c,vec2(12.9898,78.233)))*43758.5453);} mat3 rgb2yiqmat3(0.299,0.587,0.114,0.596,-0.274,-0.322,0.211,-0.523,0.312); mat3 yiq2rgbmat3(1.0,0.956,0.621,1.0,-0.272,-0.647,1.0,-1.106,1.703); vec3 hueShiftRGB(vec3 col,float deg){ vec3 yiqrgb2yiq*col; float radradians(deg); float coshcos(rad),sinhsin(rad); vec3 yiqShiftvec3(yiq.x,yiq.y*cosh-yiq.z*sinh,yiq.y*sinh+yiq.z*cosh); return clamp(yiq2rgb*yiqShift,0.0,1.0); } vec4 sigmoid(vec4 x){return 1./(1.+exp(-x));} vec4 cppn_fn(vec2 coordinate,float in0,float in1,float in2){ buf6vec4(coordinate.x,coordinate.y,0.3948333106474662+in0,0.36+in1); buf7vec4(0.14+in2,sqrt(coordinate.x*coordinate.x+coordinate.y*coordinate.y),0.,0.); buf0mat4(vec4(6.5404263,-3.6126034,0.7590882,-1.13613),vec4(2.4582713,3.1660357,1.2219609,0.06276096),vec4(-5.478085,-6.159632,1.8701609,-4.7742867),vec4(6.039214,-5.542865,-0.90925294,3.251348))*buf6+mat4(vec4(0.8473259,-5.722911,3.975766,1.6522468),vec4(-0.24321538,0.5839259,-1.7661959,-5.350116),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf7+vec4(0.21808943,1.1243913,-1.7969975,5.0294676); buf1mat4(vec4(-3.3522482,-6.0612736,0.55641043,-4.4719114),vec4(0.8631464,1.7432913,5.643898,1.6106541),vec4(2.4941394,-3.5012043,1.7184316,6.357333),vec4(3.310376,8.209261,1.1355612,-1.165539))*buf6+mat4(vec4(5.24046,-13.034365,0.009859298,15.870829),vec4(2.987511,3.129433,-0.89023495,-1.6822904),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf7+vec4(-5.9457836,-6.573602,-0.8812491,1.5436668); buf0sigmoid(buf0);buf1sigmoid(buf1); buf2mat4(vec4(-15.219568,8.095543,-2.429353,-1.9381982),vec4(-5.951362,4.3115187,2.6393783,1.274315),vec4(-7.3145227,6.7297835,5.2473326,5.9411426),vec4(5.0796127,8.979051,-1.7278991,-1.158976))*buf6+mat4(vec4(-11.967154,-11.608155,6.1486754,11.237008),vec4(2.124141,-6.263192,-1.7050359,-0.7021966),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf7+vec4(-4.17164,-3.2281182,-4.576417,-3.6401186); buf3mat4(vec4(3.1832156,-13.738922,1.879223,3.233465),vec4(0.64300746,12.768129,1.9141049,0.50990224),vec4(-0.049295485,4.4807224,1.4733979,1.801449),vec4(5.0039253,13.000481,3.3991797,-4.5561905))*buf6+mat4(vec4(-0.1285731,7.720628,-3.1425676,4.742367),vec4(0.6393625,3.714393,-0.8108378,-0.39174938),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf7+vec4(-1.1811101,-21.621881,0.7851888,1.2329718); buf2sigmoid(buf2);buf3sigmoid(buf3); buf4mat4(vec4(5.214916,-7.183024,2.7228765,2.6592617),vec4(-5.601878,-25.3591,4.067988,0.4602802),vec4(-10.57759,24.286327,21.102104,37.546658),vec4(4.3024497,-1.9625226,2.3458803,-1.372816))*buf0+mat4(vec4(-17.6526,-10.507558,2.2587414,12.462782),vec4(6.265566,-502.75443,-12.642513,0.9112289),vec4(-10.983244,20.741234,-9.701768,-0.7635988),vec4(5.383626,1.4819539,-4.1911616,-4.8444734))*buf1+mat4(vec4(12.785233,-16.345072,-0.39901125,1.7955981),vec4(-30.48365,-1.8345358,1.4542528,-1.1118771),vec4(19.872723,-7.337935,-42.941723,-98.52709),vec4(8.337645,-2.7312303,-2.2927687,-36.142323))*buf2+mat4(vec4(-16.298317,3.5471997,-0.44300047,-9.444417),vec4(57.5077,-35.609753,16.163465,-4.1534753),vec4(-0.07470326,-3.8656476,-7.0901804,3.1523974),vec4(-12.559385,-7.077619,1.490437,-0.8211543))*buf3+vec4(-7.67914,15.927437,1.3207729,-1.6686112); buf5mat4(vec4(-1.4109162,-0.372762,-3.770383,-21.367174),vec4(-6.2103205,-9.35908,0.92529047,8.82561),vec4(11.460242,-22.348068,13.625772,-18.693201),vec4(-0.3429052,-3.9905605,-2.4626114,-0.45033523))*buf0+mat4(vec4(7.3481627,-4.3661838,-6.3037653,-3.868115),vec4(1.5462853,6.5488915,1.9701879,-0.58291394),vec4(6.5858274,-2.2180402,3.7127688,-1.3730392),vec4(-5.7973905,10.134961,-2.3395722,-5.965605))*buf1+mat4(vec4(-2.5132585,-6.6685553,-1.4029363,-0.16285264),vec4(-0.37908727,0.53738135,4.389061,-1.3024765),vec4(-0.70647055,2.0111287,-5.1659346,-3.728635),vec4(-13.562562,10.487719,-0.9173751,-2.6487076))*buf2+mat4(vec4(-8.645013,6.5546675,-6.3944063,-5.5933375),vec4(-0.57783127,-1.077275,36.91025,5.736769),vec4(14.283112,3.7146652,7.1452246,-4.5958776),vec4(2.7192075,3.6021907,-4.366337,-2.3653464))*buf3+vec4(-5.9000807,-4.329569,1.2427121,8.59503); buf4sigmoid(buf4);buf5sigmoid(buf5); buf6mat4(vec4(-1.61102,0.7970257,1.4675229,0.20917463),vec4(-28.793737,-7.1390953,1.5025433,4.656581),vec4(-10.94861,39.66238,0.74318546,-10.095605),vec4(-0.7229728,-1.5483948,0.7301322,2.1687684))*buf0+mat4(vec4(3.2547753,21.489103,-1.0194173,-3.3100595),vec4(-3.7316632,-3.3792162,-7.223193,-0.23685838),vec4(13.1804495,0.7916005,5.338587,5.687114),vec4(-4.167605,-17.798311,-6.815736,-1.6451967))*buf1+mat4(vec4(0.604885,-7.800309,-7.213122,-2.741014),vec4(-3.522382,-0.12359311,-0.5258442,0.43852118),vec4(9.6752825,-22.853785,2.062431,0.099892326),vec4(-4.3196306,-17.730087,2.5184598,5.30267))*buf2+mat4(vec4(-6.545563,-15.790176,-6.0438633,-5.415399),vec4(-43.591583,28.551912,-16.00161,18.84728),vec4(4.212382,8.394307,3.0958717,8.657522),vec4(-5.0237565,-4.450633,-4.4768,-5.5010443))*buf3+mat4(vec4(1.6985557,-67.05806,6.897715,1.9004834),vec4(1.8680354,2.3915145,2.5231109,4.081538),vec4(11.158006,1.7294737,2.0738268,7.386411),vec4(-4.256034,-306.24686,8.258898,-17.132736))*buf4+mat4(vec4(1.6889864,-4.5852966,3.8534803,-6.3482175),vec4(1.3543309,-1.2640043,9.932754,2.9079645),vec4(-5.2770967,0.07150358,-0.13962056,3.3269649),vec4(28.34703,-4.918278,6.1044083,4.085355))*buf5+vec4(6.6818056,12.522166,-3.7075126,-4.104386); buf7mat4(vec4(-8.265602,-4.7027016,5.098234,0.7509808),vec4(8.6507845,-17.15949,16.51939,-8.884479),vec4(-4.036479,-2.3946867,-2.6055532,-1.9866527),vec4(-2.2167742,-1.8135649,-5.9759874,4.8846445))*buf0+mat4(vec4(6.7790847,3.5076547,-2.8191125,-2.7028968),vec4(-5.743024,-0.27844876,1.4958696,-5.0517144),vec4(13.122226,15.735168,-2.9397483,-4.101023),vec4(-14.375265,-5.030483,-6.2599335,2.9848232))*buf1+mat4(vec4(4.0950394,-0.94011575,-5.674733,4.755022),vec4(4.3809423,4.8310084,1.7425908,-3.437416),vec4(2.117492,0.16342592,-104.56341,16.949184),vec4(-5.22543,-2.994248,3.8350096,-1.9364246))*buf2+mat4(vec4(-5.900337,1.7946124,-13.604192,-3.8060522),vec4(6.6583457,31.911177,25.164474,91.81147),vec4(11.840538,4.1503043,-0.7314397,6.768467),vec4(-6.3967767,4.034772,6.1714606,-0.32874924))*buf3+mat4(vec4(3.4992442,-196.91893,-8.923708,2.8142626),vec4(3.4806502,-3.1846354,5.1725626,5.1804223),vec4(-2.4009497,15.585794,1.2863957,2.0252278),vec4(-71.25271,-62.441242,-8.138444,0.50670296))*buf4+mat4(vec4(-12.291733,-11.176166,-7.3474145,4.390294),vec4(10.805477,5.6337385,-0.9385842,-4.7348723),vec4(-12.869276,-7.039391,5.3029537,7.5436664),vec4(1.4593618,8.91898,3.5101583,5.840625))*buf5+vec4(2.2415268,-6.705987,-0.98861027,-2.117676); buf6sigmoid(buf6);buf7sigmoid(buf7); buf0mat4(vec4(1.6794263,1.3817469,2.9625452,0.),vec4(-1.8834411,-1.4806935,-3.5924516,0.),vec4(-1.3279216,-1.0918057,-2.3124623,0.),vec4(0.2662234,0.23235129,0.44178495,0.))*buf0+mat4(vec4(-0.6299101,-0.5945583,-0.9125601,0.),vec4(0.17828953,0.18300213,0.18182953,0.),vec4(-2.96544,-2.5819945,-4.9001055,0.),vec4(1.4195864,1.1868085,2.5176322,0.))*buf1+mat4(vec4(-1.2584374,-1.0552157,-2.1688404,0.),vec4(-0.7200217,-0.52666044,-1.438251,0.),vec4(0.15345335,0.15196142,0.272854,0.),vec4(0.945728,0.8861938,1.2766753,0.))*buf2+mat4(vec4(-2.4218085,-1.968602,-4.35166,0.),vec4(-22.683098,-18.0544,-41.954372,0.),vec4(0.63792,0.5470648,1.1078634,0.),vec4(-1.5489894,-1.3075932,-2.6444845,0.))*buf3+mat4(vec4(-0.49252132,-0.39877754,-0.91366625,0.),vec4(0.95609266,0.7923952,1.640221,0.),vec4(0.30616966,0.15693925,0.8639857,0.),vec4(1.1825981,0.94504964,2.176963,0.))*buf4+mat4(vec4(0.35446745,0.3293795,0.59547555,0.),vec4(-0.58784515,-0.48177817,-1.0614829,0.),vec4(2.5271258,1.9991658,4.6846647,0.),vec4(0.13042648,0.08864098,0.30187556,0.))*buf5+mat4(vec4(-1.7718065,-1.4033192,-3.3355875,0.),vec4(3.1664357,2.638297,5.378702,0.),vec4(-3.1724713,-2.6107926,-5.549295,0.),vec4(-2.851368,-2.249092,-5.3013067,0.))*buf6+mat4(vec4(1.5203838,1.2212278,2.8404984,0.),vec4(1.5210563,1.2651345,2.683903,0.),vec4(2.9789467,2.4364579,5.2347264,0.),vec4(2.2270417,1.8825914,3.8028636,0.))*buf7+vec4(-1.5468478,-3.6171484,0.24762098,0.); buf0sigmoid(buf0); return vec4(buf0.x,buf0.y,buf0.z,1.); } void mainImage(out vec4 fragColor,in vec2 fragCoord){ vec2 uvfragCoord/uResolution.xy*2.-1.; uv.y*-1.; // Корректируем aspect ratio float aspect uResolution.x / uResolution.y; if (aspect > 1.0) { uv.x * aspect; } else { uv.y / aspect; } uv+uWarp*vec2(sin(uv.y*6.283+uTime*0.5),cos(uv.x*6.283+uTime*0.5))*0.05; fragColorcppn_fn(uv,0.1*sin(0.3*uTime),0.1*sin(0.69*uTime),0.1*sin(0.44*uTime)); } void main(){ vec4 col;mainImage(col,gl_FragCoord.xy); col.rgbhueShiftRGB(col.rgb,uHueShift); // Белый режим if (uWhiteMode > 0.5) { float gray dot(col.rgb, vec3(0.299, 0.587, 0.114)); col.rgb vec3(gray * 2.0); // Усиливаем яркость для белого } float scanline_valsin(gl_FragCoord.y*uScanFreq)*0.5+0.5; col.rgb*1.-(scanline_val*scanline_val)*uScan; col.rgb+(rand(gl_FragCoord.xy+uTime)-0.5)*uNoise; gl_FragColorvec4(clamp(col.rgb,0.0,1.0),1.0); } `; // Создаем шейдеры const vertexShader this.createShader(gl, gl.VERTEX_SHADER, vertexShaderSource); const fragmentShader this.createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource); // Создаем программу this.program this.createProgram(gl, vertexShader, fragmentShader); // Получаем расположения this.positionAttributeLocation gl.getAttribLocation(this.program, position); this.timeUniformLocation gl.getUniformLocation(this.program, uTime); this.resolutionUniformLocation gl.getUniformLocation(this.program, uResolution); this.hueShiftUniformLocation gl.getUniformLocation(this.program, uHueShift); this.noiseUniformLocation gl.getUniformLocation(this.program, uNoise); this.scanUniformLocation gl.getUniformLocation(this.program, uScan); this.scanFreqUniformLocation gl.getUniformLocation(this.program, uScanFreq); this.warpUniformLocation gl.getUniformLocation(this.program, uWarp); this.whiteModeUniformLocation gl.getUniformLocation(this.program, uWhiteMode); // Создаем треугольник (полный экран) this.positionBuffer gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array( -1, -1, 3, -1, -1, 3 ), gl.STATIC_DRAW); } createShader(gl, type, source) { const shader gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { console.error(Shader compilation error:, gl.getShaderInfoLog(shader)); gl.deleteShader(shader); return null; } return shader; } handleVisibility () > { if (document.hidden) { if (this.frame) cancelAnimationFrame(this.frame); this.frame null; } else if (!this.frame) { this._lastTs 0; this.frame requestAnimationFrame((t) > this.loop(t)); } }; createProgram(gl, vertexShader, fragmentShader) { const program gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { console.error(Program linking error:, gl.getProgramInfoLog(program)); gl.deleteProgram(program); return null; } return program; } resize() { const w window.innerWidth; const h window.innerHeight; const scale this.resolutionScale; const cw Math.max(1, (w * scale) | 0); const ch Math.max(1, (h * scale) | 0); if (this.canvas.width ! cw || this.canvas.height ! ch) { this.canvas.width cw; this.canvas.height ch; } this.canvas.style.width w + px; this.canvas.style.height h + px; this.gl.viewport(0, 0, cw, ch); } loop(ts performance.now()) { const gl this.gl; // кап FPS const dt ts - this._lastTs; if (dt this.minFrameInterval) { this.frame requestAnimationFrame((t) > this.loop(t)); return; } this._lastTs ts; const currentTime ((ts - this.startTime) / 1000) * this.options.speed; gl.viewport(0, 0, this.canvas.width, this.canvas.height); gl.clearColor(0, 0, 0, 1); gl.clear(gl.COLOR_BUFFER_BIT); gl.useProgram(this.program); gl.uniform1f(this.timeUniformLocation, currentTime); gl.uniform2f(this.resolutionUniformLocation, this.canvas.width, this.canvas.height); gl.uniform1f(this.hueShiftUniformLocation, this.options.hueShift); gl.uniform1f(this.noiseUniformLocation, this.options.noiseIntensity); gl.uniform1f(this.scanUniformLocation, this.options.scanlineIntensity); gl.uniform1f(this.scanFreqUniformLocation, this.options.scanlineFrequency); gl.uniform1f(this.warpUniformLocation, this.options.warpAmount); gl.uniform1f(this.whiteModeUniformLocation, this.options.whiteMode ? 1.0 : 0.0); gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer); gl.enableVertexAttribArray(this.positionAttributeLocation); gl.vertexAttribPointer(this.positionAttributeLocation, 2, gl.FLOAT, false, 0, 0); gl.drawArrays(gl.TRIANGLES, 0, 3); this.frame requestAnimationFrame((t) > this.loop(t)); } destroy() { if (this.frame) { cancelAnimationFrame(this.frame); } } } // Глобальная переменная для управления let darkVeilInstance null; let backgroundOpacity 1.0; let splineViewY 0; let opacityAnimationFrame null; let positionAnimationFrame null; // Доступные методы для Android: // enableBack() - выключает фон с анимацией 0.25 сек // disableBack() - включает фон с анимацией 0.25 сек // moveUp() - поднимает Spline view на 30% вверх с анимацией 0.25 сек // moveDown() - возвращает Spline view в исходную позицию с анимацией 0.25 сек // Функции для управления из Android function setWhiteMode(enabled) { if (darkVeilInstance) { darkVeilInstance.options.whiteMode enabled; } } // Методы для управления фоном // enableBack() - мгновенно выключает фон с анимацией альфа 0.25 сек function enableBack() { if (darkVeilInstance && darkVeilInstance.canvas) { animateOpacity(0.0, 0.25); } } // disableBack() - мгновенно включает фон с анимацией альфа 0.25 сек function disableBack() { if (darkVeilInstance && darkVeilInstance.canvas) { animateOpacity(1.0, 0.25); } } // Анимация прозрачности фона function animateOpacity(targetOpacity, duration) { const startOpacity backgroundOpacity; const startTime performance.now(); function updateOpacity(currentTime) { const elapsed (currentTime - startTime) / 1000; const progress Math.min(elapsed / duration, 1.0); // Интерполяция easeOut const easeOutProgress 1 - Math.pow(1 - progress, 3); backgroundOpacity startOpacity + (targetOpacity - startOpacity) * easeOutProgress; if (darkVeilInstance && darkVeilInstance.canvas) { darkVeilInstance.canvas.style.opacity backgroundOpacity; } if (progress 1.0) { opacityAnimationFrame requestAnimationFrame(updateOpacity); } } if (opacityAnimationFrame) { cancelAnimationFrame(opacityAnimationFrame); } opacityAnimationFrame requestAnimationFrame(updateOpacity); } // Методы для управления позицией Spline view // moveUp() - поднимает Spline view на 30% вверх с анимацией easeOut за 0.25 сек function moveUp() { animateSplinePosition(-23, 0.25); } // moveDown() - возвращает Spline view в исходную позицию с анимацией easeOut за 0.25 сек function moveDown() { animateSplinePosition(0, 0.25); } // Анимация позиции Spline view function animateSplinePosition(targetY, duration) { const startY splineViewY; const startTime performance.now(); function updatePosition(currentTime) { const elapsed (currentTime - startTime) / 1000; const progress Math.min(elapsed / duration, 1.0); // Интерполяция easeOut const easeOutProgress 1 - Math.pow(1 - progress, 3); splineViewY startY + (targetY - startY) * easeOutProgress; const contentElement document.querySelector(.content); if (contentElement) { // Начальная позиция -50% по Y, добавляем смещение const finalY -50 + splineViewY; contentElement.style.transform `translate(-50%, ${finalY}%)`; } if (progress 1.0) { positionAnimationFrame requestAnimationFrame(updatePosition); } } if (positionAnimationFrame) { cancelAnimationFrame(positionAnimationFrame); } positionAnimationFrame requestAnimationFrame(updatePosition); } function toggleWhiteMode() { if (darkVeilInstance) { darkVeilInstance.options.whiteMode !darkVeilInstance.options.whiteMode; } } function isWhiteMode() { return darkVeilInstance ? darkVeilInstance.options.whiteMode : false; } // Переменная для хранения Spline приложения let splineApp null; // Функция для генерации рандомного хеша function generateRandomHash() { return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); } // Функции для управления Spline переменными connected/disconnected function setConnected() { if (splineApp) { try { const hash generateRandomHash(); console.log(Setting connected to:, hash); splineApp.setVariable(connected, hash); } catch (e) { console.log(Error setting connected variable:, e); } } else { console.log(Spline app not loaded yet); } } function setDisconnected() { if (splineApp) { try { const hash generateRandomHash(); console.log(Setting disconnected to:, hash); splineApp.setVariable(disconnected, hash); } catch (e) { console.log(Error setting disconnected variable:, e); } } else { console.log(Spline app not loaded yet); } } function connectSpline() { console.log(Connecting Spline...); setConnected(); window.splineConnected true; } function disconnectSpline() { console.log(Disconnecting Spline...); setDisconnected(); window.splineConnected false; } function toggleSplineConnection() { window.splineConnected !window.splineConnected; if (window.splineConnected) { setConnected(); } else { setDisconnected(); } } // Инициализируем состояние window.splineConnected false; // Загружаем Spline Runtime и сцену async function loadSpline() { try { // Подключаем Spline Runtime const script document.createElement(script); script.type module; script.textContent ` import { Application } from /script.js; const canvas document.getElementById(canvas3d); const app new Application(canvas); // Загружаем сцену await app.load(${window.location.origin}/scene.splinecode); // Сохраняем приложение в глобальной переменной window.splineApp app; console.log(Spline app loaded successfully:, app); // Уведомляем Android о загрузке Spline if (typeof AndroidInterface ! undefined) { AndroidInterface.onSplineLoaded(); } // Устанавливаем начальные состояния переменных setTimeout(() > { try { app.setVariable(disconnected, ); console.log(Initial variables set); } catch (e) { console.log(Error setting initial variables:, e); } }, 1000); `; document.head.appendChild(script); // Ждем загрузки const checkApp setInterval(() > { if (window.splineApp) { splineApp window.splineApp; clearInterval(checkApp); console.log(Spline app ready); } }, 100); } catch (error) { console.error(Error loading Spline:, error); // Уведомляем Android об ошибке if (typeof AndroidInterface ! undefined) { AndroidInterface.onSplineError(error.toString()); } } } // Запускаем загрузку Spline loadSpline(); setWhiteMode(true); // Инициализация document.addEventListener(DOMContentLoaded, function() { const canvas document.getElementById(darkVeilCanvas); darkVeilInstance new DarkVeil(canvas, { hueShift: 0, noiseIntensity: 0.02, scanlineIntensity: 0, speed: 0.5, scanlineFrequency: 0, warpAmount: 0.1, resolutionScale: 0.5, whiteMode: false }); // Предотвращаем скролл на мобильных document.addEventListener(touchmove, function(e) { e.preventDefault(); }, { passive: false }); }); /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]