Warning, /plasma-bigscreen/mycroft-skill-installer/app/qml/CanBackground.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * SPDX-FileCopyrightText: 2019-2020 Aditya Mehra <aix.m@outlook.org> 0003 * 0004 * SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 import QtQuick 2.9 0008 import "code/Rnd.js" as MathFn 0009 0010 Item { 0011 anchors.fill: parent 0012 0013 Component.onCompleted: { 0014 delay(2000, function() { 0015 timr.running = true 0016 }) 0017 } 0018 0019 Timer { 0020 id: timer 0021 } 0022 0023 function delay(delayTime, cb) { 0024 timer.interval = delayTime; 0025 timer.repeat = false; 0026 timer.triggered.connect(cb); 0027 timer.start(); 0028 } 0029 0030 Timer { 0031 id: timr 0032 interval: 100 0033 repeat: true 0034 running: false 0035 0036 onTriggered: { 0037 bgCanvas.requestAnimationFrame(bgCanvas.tick) 0038 } 0039 } 0040 0041 Canvas { 0042 id: bgCanvas 0043 anchors.fill: parent 0044 renderStrategy: Canvas.Threaded 0045 property var w: bgCanvas.width 0046 property var h: bgCanvas.height 0047 property var ctx 0048 property var rows 0049 property var cols 0050 property var hexGrid 0051 property var hex 0052 property var nextT 0053 property var fadeT 0054 property var hue 0055 property var count 0056 property var grid: []; 0057 property var watchList: []; 0058 property var radius: 5; 0059 0060 function init() { 0061 nextT = 0 0062 fadeT = 0 0063 hue = 0 0064 count = 0; 0065 grid = []; 0066 radius = Math.max(12,h/80); 0067 hexGrid = buildGrid(w, h, radius); 0068 } 0069 0070 function buildGrid(w, h, r) { 0071 var rowh = r * Math.sin(Math.PI / 3); 0072 var colW = r * 2 * 1.5; 0073 rows = Math.ceil(h / rowh) + 1; 0074 cols = Math.ceil(w / colW) + 1; 0075 var grid = []; 0076 for (var row = 0; row < rows; row++) { 0077 var y = row * rowh; 0078 for (var col = 0; col < cols; col++) { 0079 var x = col * colW + (row % 2) * colW / 2; 0080 var hex = {col: col, row: row, tol: 1 + MathFn.rnd.float(2), pot: 0}; 0081 hex.color = Qt.hsla(MathFn.rnd.float(198, 204), 20, MathFn.rnd.float(75, 80), MathFn.rnd.float(0.01, 0.03)); 0082 hex.x = x; 0083 hex.y = y; 0084 grid.push(hex); 0085 } 0086 } 0087 0088 // neighbors: 0089 for (var i = 0, l = grid.length; i < l; i++) { 0090 hex = grid[i]; 0091 var off = hex.row % 2; 0092 col = hex.col; 0093 hex.neighbors = [ 0094 grid[i - cols * 2], 0095 col + off < cols ? grid[i - cols + off] : null, 0096 col + off < cols ? grid[i + cols + off] : null, 0097 grid[i + cols * 2], 0098 col + off > 0 ? grid[i + cols - 1 + off] : null, 0099 col + off > 0 ? grid[i - cols - 1 + off] : null 0100 ]; 0101 } 0102 0103 return grid; 0104 } 0105 0106 function drawGrid(ctx, grid) { 0107 for (var i = 0, l = grid.length; i < l; i++) { 0108 var hex = grid[i]; 0109 if (!hex.clean) { 0110 var m = MathFn.rnd(0.6,1); 0111 drawHex(ctx, hex.x, hex.y, hex.color, m, MathFn.rnd(1,radius/6)); 0112 drawHex(ctx, hex.x, hex.y, hex.color, MathFn.rnd(0.2,m-0.1), MathFn.rnd(1,radius/4)); 0113 hex.clean = true; 0114 } 0115 } 0116 } 0117 0118 function tick() { 0119 //bgCanvas.requestPaint() 0120 var delta = (1000 / timr.interval), grid = hexGrid; 0121 var t = getTime(); 0122 for (var i = watchList.length - 1; i >= 0; i--) { 0123 var hex = watchList[i]; 0124 if (!hex) { break; } 0125 if (hex.t < t) { 0126 removeFromWatch(hex); 0127 trigger(hex, t); 0128 } 0129 } 0130 0131 if (fadeT < t) { 0132 ctx.globalCompositeOperation = "destination-in"; 0133 ctx.fillStyle = Qt.hsla(0, 0, 100, 0.95); 0134 ctx.fillRect(0, 0, w, h); 0135 ctx.globalCompositeOperation = "lighter"; 0136 fadeT = t + 250; 0137 } 0138 0139 if (t > nextT) { 0140 hex = hexGrid[MathFn.rnd.integer(cols) - cols + cols * rows] 0141 hex.t = getTime() + MathFn.rnd.float(100, 200); 0142 hex.from = 4;//Math.random(6); 0143 hex.hue = MathFn.rnd(360); 0144 hex.lm = 0.7; 0145 hex.chance = 1.2; 0146 watchList.push(hex); 0147 nextT = getTime() + 200; 0148 } 0149 drawGrid(ctx, hexGrid); 0150 } 0151 0152 function trigger(hex, t) { 0153 hex.val = MathFn.rnd(400,900); 0154 hex.t = t + hex.val; 0155 hex.clean = false; 0156 var chance = hex.chance; 0157 while (MathFn.rnd.boolean(chance)) { 0158 var turn = MathFn.rnd.bit(2.5) * MathFn.rnd.sign(); 0159 var dir = (hex.from + 3 + turn + 6) % 6; 0160 var neighbor = hex.neighbors[dir]; 0161 chance *= 0.25; 0162 if (!neighbor || neighbor.t >= t) { 0163 continue; 0164 } 0165 neighbor.val = MathFn.rnd.float(0,1)*MathFn.rnd.float(0,1)*50+5; 0166 neighbor.t = t;// + neighbor.val; 0167 neighbor.from = (dir + 3) % 6; 0168 neighbor.chance = hex.chance * 0.999; 0169 neighbor.hue = hex.hue // + Math.random(-3,3)+(dir-3); 0170 neighbor.color = Qt.hsla(neighbor.hue, 50, MathFn.rnd(10,35)); 0171 neighbor.lm = hex.lm; 0172 watchList.push(neighbor); 0173 } 0174 } 0175 0176 function removeFromWatch(hex) { 0177 // this could be improved by switching to a double linked list 0178 for (var i = watchList.length - 1; i >= 0; i--) { 0179 if (hex === watchList[i]) { 0180 watchList.splice(i,1); 0181 } 0182 } 0183 } 0184 0185 function getTime() { 0186 return (new Date()).getTime(); 0187 } 0188 0189 function drawHex(ctx, x, y, fill, m, s) { 0190 var r = radius-1-s/2; 0191 r *= m||1; 0192 r = Math.ceil(r); 0193 ctx.beginPath(); 0194 var p = Math.PI / 6 * 2; 0195 for (var i = 0; i < 6; i++) { 0196 var x1 = x + Math.cos(p * i) * r, y1 = y + Math.sin(p * i) * r; 0197 if (i == 0) { 0198 ctx.moveTo(x1, y1); 0199 } 0200 else { 0201 ctx.lineTo(x1, y1); 0202 } 0203 } 0204 ctx.closePath(); 0205 ctx.strokeStyle = fill; 0206 ctx.lineWidth = s||1; 0207 ctx.stroke(); 0208 return ctx; 0209 } 0210 0211 onPaint: { 0212 //console.log("here") 0213 ctx = getContext("2d") 0214 init() 0215 } 0216 onPainted: { 0217 bgCanvas.tick() 0218 } 0219 } 0220 }