{"name":"dev_PARTY #009","description":"Interactive NFT by @andriibakulin\n\n<code>\nconst gCount = 48;\n\nlet gEntities = [];\nlet gOffsetX = 0;\nlet gOffsetY = 0;\n\nclass Entity\n{\n    constructor(index)\n    {\n        this.index = index;\n        this.color = 256/gCount * index;\n        this.offset = 0;\n    }\n\n    next(dt)\n    {\n        this.offset += dt;\n    }\n\n    render(index)\n    {\n        const size = Math.min(window.innerWidth, window.innerHeight) * 0.33;\n\n        resetMatrix();\n\n        translate(window.innerWidth / 2, window.innerHeight / 2);\n        rotate(360/gCount * index + this.offset * 20 * (1+gOffsetY*0.1));\n\n        noFill();\n\n        for (let i=0; i<=10; i++)\n        {\n            stroke(this.color, 255, 255, 255 * (10-i)/10);\n            strokeWeight((10-i)*0.3)\n            circle(size + (gOffsetX - size*0.1) * i * 0.3, gOffsetY, (20+gOffsetX)*i);\n            rotate(15);\n        }\n    }\n}\n\nfunction setup()\n{\n    createCanvas(window.innerWidth, window.innerHeight);\n\n    pixelDensity(1);\n    frameRate(60);\n\n    colorMode(HSB, 255);\n    angleMode(DEGREES);\n\n    background(0);\n\n    for (let index=0; index<gCount; index++)\n    {\n        gEntities.push(new Entity(index));\n    }\n}\n\nfunction windowResized()\n{\n    resizeCanvas(window.innerWidth, window.innerHeight);\n}\n\nlet lastPressedX = null;\nlet lastPressedY = null;\n\nfunction draw()\n{\n    const dt = deltaTime/1000;\n\n    if (mouseIsPressed)\n    {\n        if (lastPressedX != null)\n        {\n            gOffsetX += (mouseX - lastPressedX) * 0.2;\n            gOffsetY += (mouseY - lastPressedY) * 0.2;\n        }\n\n        lastPressedX = mouseX;\n        lastPressedY = mouseY;\n    }\n    else\n    {\n        gOffsetX = 0;\n        gOffsetY = 0;\n\n        lastPressedX = null;\n        lastPressedY = null;\n    }\n\n    background(0);\n\n    for (const idx in gEntities)\n    {\n        const ent = gEntities[idx];\n        ent.render(idx);\n        ent.next(dt);\n    }\n}\n</code>","tags":["codeart","interactive","procedural","generative","generativeart","realtime","p5js","p5func"],"symbol":"OBJKT","artifactUri":"ipfs://QmaMqkbgYGfKMBCDDyooCQhLDweeMCjt71h3X12RkaB9qr","displayUri":"ipfs://QmTrAi7j8xn7yract3nnnHebiQxTACM3d8hFLuxEXGstJE","thumbnailUri":"ipfs://QmNrhZHUaEqxhyLfqoq1mtHSipkWHeT31LNHb1QEbDHgnc","creators":["tz1Ys42frYhgxHxXtqoY42GiuRPZ9ykbP86Y"],"formats":[{"uri":"ipfs://QmaMqkbgYGfKMBCDDyooCQhLDweeMCjt71h3X12RkaB9qr","mimeType":"application/x-directory"}],"decimals":0,"isBooleanAmount":false,"shouldPreferSymbol":false}