{"name":"dev_PARTY #007","description":"Interactive NFT by @andriibakulin\n\n<code>\nlet gEntities = [];\n\nlet gOffsetX = 0.5;\nlet gOffsetY = 0.5;\n\nclass Entity\n{\n    constructor(index, count)\n    {\n        this.seqOffset = index / count;\n        this.offset = 0;\n    }\n\n    next(dt)\n    {\n        this.offset += dt;\n    }\n\n    render()\n    {\n        const baseLen = Math.min(window.innerWidth, window.innerHeight);\n\n        noFill();\n\n        stroke(this.seqOffset * 255, 255, 255);\n        strokeWeight(1);\n\n        resetMatrix();\n        translate(window.innerWidth / 2, window.innerHeight / 2);\n        rotate(this.seqOffset * 360 + this.offset * 30);\n\n        let radius1 = baseLen / 5 + ((gOffsetX-0.5)*2) * 200 - gOffsetY * 100;\n        let radius2 = baseLen / 8 - gOffsetY * 100;\n\n        for (let i=0; i<8; i++)\n        {\n            let dx = Math.sin(this.offset * 2) * i * baseLen/25 * (gOffsetY + 0.5);\n\n            circle(baseLen * 0.25 + dx, 0, lerp(radius1, radius2, i/8));\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<16; index++)\n    {\n        gEntities.push(new Entity(index, 16));\n    }\n}\n\nfunction windowResized()\n{\n    resizeCanvas(window.innerWidth, window.innerHeight);\n}\n\nfunction draw()\n{\n    const winW = window.innerWidth;\n    const winH = window.innerHeight;\n\n    const dt = deltaTime/1000;\n\n    if (mouseIsPressed)\n    {\n        gOffsetX = mouseX / winW;\n        gOffsetY = mouseY / winH;\n    }\n\n    background(0);\n\n    for (var idx in gEntities)\n    {\n        const ent = gEntities[idx];\n        ent.render();\n        ent.next(dt);\n    }\n\n    // Show controls...\n\n    const size = 10;\n    const half = size/2;\n    const round = size/4;\n\n    resetMatrix();\n    fill(0,0,255);\n    noStroke();\n    square(winW * gOffsetX - half, 0    - half, size, round);\n    square(winW * gOffsetX - half, winH - half, size, round);\n    square(0    - half, winH * gOffsetY - half, size, round);\n    square(winW - half, winH * gOffsetY - half, size, round);\n}\n</code>","tags":["codeart","interactive","procedural","generative","generativeart","realtime","p5js","p5func"],"symbol":"OBJKT","artifactUri":"ipfs://QmdqcGxbqittKeVMLQwHAxVwY2wB9ctgShnGs66b5gqegz","displayUri":"ipfs://QmWtEiuZE1QNaYfRtgtEJkXFb1ZX38ye3vxYcCBQohbfio","thumbnailUri":"ipfs://QmNrhZHUaEqxhyLfqoq1mtHSipkWHeT31LNHb1QEbDHgnc","creators":["tz1Ys42frYhgxHxXtqoY42GiuRPZ9ykbP86Y"],"formats":[{"uri":"ipfs://QmdqcGxbqittKeVMLQwHAxVwY2wB9ctgShnGs66b5gqegz","mimeType":"application/x-directory"}],"decimals":0,"isBooleanAmount":false,"shouldPreferSymbol":false}