{"name":"dev_PARTY #008","description":"Interactive NFT by @andriibakulin\n\n<code>\nconst ITEMS_COUNT_PER_ROW = 12;\n\nlet gEntities = [];\nlet gSizeArea;\nlet gSizeItem;\n\nclass Entity\n{\n    constructor(xi, yi)\n    {\n        this.xi = xi;\n        this.yi = yi;\n        this.color = 128;\n        this.power = 0;\n    }\n\n    next(dt)\n    {\n        this.color += dt * 100;\n    }\n\n    render()\n    {\n        const x = gSizeItem * (this.xi+0.5);\n        const y = gSizeItem * (this.yi+0.5);\n\n        let size = 10;\n        let power = 0;\n        let kThreshhold;\n\n        if (mouseIsPressed)\n        {\n            let distance = Math.sqrt((x - mouseX)**2 + (y - mouseY)**2);\n\n            power = distance / (gSizeArea * 0.33);\n            power = Math.min(power, 1.0);\n            power = Math.max(power, 0.0);\n            power = 1 - power;\n\n            kThreshhold = power * 0.05;\n\n            if (kThreshhold < 0.03)\n                kThreshhold = 0.03;\n        }\n        else\n        {\n            kThreshhold = 0.02;\n        }\n\n        if (Math.abs(this.power-power) > kThreshhold)\n        {\n            if (this.power < power) power = this.power + kThreshhold;\n            else                    power = this.power - kThreshhold;\n        }\n\n        size += gSizeItem * power * 2;\n\n        this.drawInstance(x, y, +1, power, size)\n\n        if (power > 0)\n            this.drawInstance(x, y, -1, power, size)\n\n        this.power = power;\n    }\n\n    drawInstance(x, y, direction, power, size)\n    {\n        const colorV = this.colorValue(power*100);\n\n        resetMatrix();\n\n        translate(x, y);\n        rotate(power * direction * 90);\n\n        stroke(colorV, 255, 255);\n        fill(colorV, 255, 255, 64);\n\n        rect(-size*1.5, -size*0.05, size*3, +size*0.1);\n    }\n\n    colorValue(offset)\n    {\n        return (this.color + offset) % 255;\n    }\n}\n\nfunction setup()\n{\n    gSizeArea = getAreaSize();\n    gSizeItem = gSizeArea / ITEMS_COUNT_PER_ROW;\n\n    createCanvas(gSizeArea, gSizeArea);\n\n    pixelDensity(1);\n    frameRate(60);\n\n    colorMode(HSB, 255);\n    angleMode(DEGREES);\n\n    background(0);\n\n    for (let yi=0; yi<ITEMS_COUNT_PER_ROW; yi++)\n    {\n        for (let xi=0; xi<ITEMS_COUNT_PER_ROW; xi++)\n        {\n            gEntities.push(new Entity(xi, yi));\n        }\n    }\n}\n\nfunction windowResized()\n{\n    gSizeArea = getAreaSize();\n    gSizeItem = gSizeArea / ITEMS_COUNT_PER_ROW;\n\n    resizeCanvas(gSizeArea, gSizeArea);\n}\n\nfunction draw()\n{\n    const dt = deltaTime/1000;\n\n    background(0);\n\n    for (const idx in gEntities)\n    {\n        const ent = gEntities[idx];\n        ent.render();\n        ent.next(dt);\n    }\n}\n\nfunction getAreaSize()\n{\n    return Math.min(window.innerWidth, window.innerHeight);\n}\n</code>\n","tags":["codeart","interactive","procedural","generative","generativeart","realtime","p5js","p5func"],"symbol":"OBJKT","artifactUri":"ipfs://QmctA6RpsJL73cahgb6iqPPEFbcA18YpH6qJrfGGhh61oV","displayUri":"ipfs://QmQtFGS2hqcRRB7TrNepH8L8ohNA6JQ9zzaaF2gEpb1BQ7","thumbnailUri":"ipfs://QmNrhZHUaEqxhyLfqoq1mtHSipkWHeT31LNHb1QEbDHgnc","creators":["tz1Ys42frYhgxHxXtqoY42GiuRPZ9ykbP86Y"],"formats":[{"uri":"ipfs://QmctA6RpsJL73cahgb6iqPPEFbcA18YpH6qJrfGGhh61oV","mimeType":"application/x-directory"}],"decimals":0,"isBooleanAmount":false,"shouldPreferSymbol":false}