0xb9ed…9dfb

All memos sent from and to 0xb9ed…9dfb.

function tokyoParams() { displayRed = true; displayGreen = true; displayBlue = true; bColor = 246; lengthScalar = 0.8; cityNum = 1; } function berlinParams() { displayRed = false; displayGreen = true; displayBlue = true; bColor = 15; lengthScalar = 0.5; cityNum = 2; } function londonParams() { displayRed = true; displayGreen = false; displayBlue = true; bColor = 246; lengthScalar = 0.5; cityNum = 3; } function nycParams() { displayRed = false; displayGreen = false; displayBlue = true; bColor = 246; lengthScalar = 0.7; cityNum = 4; } function cdmxParams() { displayRed = false; displayGreen = true; displayBlue = false; bColor = 51; lengthScalar = 0.7; cityNum = 5; } function laParams() { displayRed = true; displayGreen = true; displayBlue = true; bColor = 26; lengthScalar = 0.8; cityNum = 6; } function keyPressed() { if (key == "=" || key == "+") { for (let i = 0; i < shapes.length; i++) { for (let j = 0; j < shapes[i].length; j++) { shapes[i][j].upScale(); } } } else if (key == "-" || key == "_") { for (let i = 0; i < shapes.length; i++) { for (let j = 0; j < shapes[i].length; j++) { shapes[i][j].downScale(); } } } else if (key == "d" || key == "D") { viewDiagram = !viewDiagram; } else if (key == " ") { bColor -= 26; if (bColor <= 0) { bColor = 255; } } else if (key == "r" || key == "R") { displayRed = !displayRed; } else if (key == "g" || key == "G") { displayGreen = !displayGreen; } else if (key == "b" || key == "B") { displayBlue = !displayBlue; } else if (key == "1") { tokyoParams(); } else if (key == "2") { berlinParams(); } else if (key == "3") { londonParams(); } else if (key == "4") { nycParams(); } else if (key == "5") { cdmxParams(); } else if (key == "6") { laParams(); } else if (keyCode == UP_ARROW) { stillLifeDepthNeg += 26; stillLifeDepthPos += 26; } else if (keyCode == DOWN_ARROW) { stillLifeDepthNeg -= 26; stillLifeDepthPos -= 26; } else if (key == "s" || key == "S") { speedIndex++; speedIndex = speedIndex % speeds.length; speedScalar = speeds[speedIndex]; } else if (key == "0") { lengthScalar += 0.2; } else if (key == "9") { if (lengthScalar > 0.4) { lengthScalar -= 0.2; } } else if (key == "t" || key == "T") { rezIndex++; if (rezIndex >= rezs.length) { rezIndex = 0; } doIt(); } else if (key == "p" || key == "P") { saveCanvas( nf(walletCount, 3) + "-" + walletCount + "-" + frameCount + ".png", 0, 0, width, height ); } else if (key == "e" || key == "E") { allCenter(); } else if (key == "w" || key == "W") { allRandom(); } else if (key == "q" || key == "Q") { allGrid(); } else if (key == "x" || key == "X") { multiplyOn = !multiplyOn; } else if (key == "i" || key == "I") { infoOverlay = !infoOverlay; } } class RND { constructor(seed) { this.seed = seed; } rd() { this.seed ^= this.seed << 13; this.seed ^= this.seed >> 17; this.seed ^= this.seed << 5; return ((this.seed < 0 ? ~this.seed + 1 : this.seed) % 1000) / 1000; } rb(a, b) { return a + (b - a) * this.rd(); } } let all_wallets = [ "0x015Dba998332771212F9d6D3536eCFa95a1cF8e6", "0x0871E6872f0CdEb32eb013648a76575B4d2dBa80", "0x0D13A6950A3d2B982EcD6Eb130FAF20cFDacD928", "0x113d754Ff2e6Ca9Fd6aB51932493E4F9DabdF596", "0x113d754Ff2e6Ca9Fd6aB51932493E4F9DabdF596", "0x113d754Ff2e6Ca9Fd6aB51932493E4F9DabdF596", "0x113d754Ff2e6Ca9Fd6aB51932493E4F9DabdF596", "0x113d754Ff2e6Ca9Fd6aB51932493E4F9DabdF596", "0x113d754Ff2e6Ca9Fd6aB51932493E4F9DabdF596", "0x113d754Ff2e6Ca9Fd6aB51932493E4F9DabdF596", "0x146D745139d417B8b5A1190cC73b34D7D37A9bBa", "0x1F5743DF7C907a74C8cC28Fe0E27c575830AC6A6", "0x222f6Df5B750Eb55234DA53d370bB2e8F5a1651d", "0x231595E3673a10e846803194f4982E1CF3389161", "0x231595E3673a10e846803194f4982E1CF3389161", "0x23787626349Cc170bFC512E5b5E3D3F44e00D02D", "0x255EeFD8307B3878be1E620FBd6A0ffA193B1CC5", "0x2586319850DEfD14dBFa93fE588780FDEA0d4336", "0x269D89631ba588a6994bF5A0DccB2A86573781fC", "0x27Ae95688aEDef0a38AbEb9f5d4d494Fc7CeB4c8", "0x27Eb78C1Eade6fc040d25b94E7acf6BBe0689F0A", "0x2B85f187f13e8fc5DB2dEC5027889e9Dfd0bC348", "0x2E23433769DB1505230A97EF9a7327E0224e480F", "0x2E23433769DB1505230A97EF9a7327E0224e480F", "0x2E23433769DB1505230A97EF9a7327E0224e480F", "0x32c5299093a3F9D412EA0EB7a2B3D757810f795B", "0x3a9139477D5cf400F843407D0Be1ABf9e130FE5C", "0x415398D5d063677E210F7E66087898A1719D0FD3", "0x457ee5f723C7606c12a7264b52e285906F91eEA6", "0x457ee5f723C7606c12a7264b52e285906F91eEA6", "0x484585fe5B976C2AFAC0f2c912447059EF41bf78", "0x49C7B3cDA921DEe28B0493f60d4AfA57663ebEF2", "0x4c40Ce702C4A1A7A231f513A27748ed1Ec258bAF", "0x4d6703cE6cC2Af54114f878E2f2500506b67484B", "0x4dE89162f766eeb2B0ed7DEc561F91f87DD50dc9", "0x51e5152bcd6ebeA8Aa64578C8Ba51E9C6d0bf435", "0x51ec5e1b8B3C4C6baE49619e657F94C4AD577b45", "0x5772e36143277356fCB562a124613C99f3502aE7", "0x598A0aD5e6229dBca38186e9441D73e15Cad652a", "0x5a5617BA16Beba3d04ae3C6b1e9d522c1856763C", "0x5aA7652ff7A493bAa40F50121b6D3040Da02997F", "0x616eb98d0BbE7581bd78c6BE56Ea6D349Cb72229", "0x685e34c6A94F330fa494D708b652261140b55aBA", "0x6B69edF4667FFbdF0Aa7D52e99F9e7Fce8174AbA", "0x75256A46E98Eb0F9c4eefc197eb3DD88d559a771", "0x7614114828F5B2dA4C6A6366EeaE91912Cb376Bf", "0x76b1F80D532c7496a95e8b4714dF239e29922302", "0x778379CA63D4C7A1dc0B20555bD4fB077CB9748a", "0x77DA0BD38461d28eE1299dbA1343288Cbe113Ab3", "0x789a5b918B997B5A2FEc160ceaa12765f5Ff43Ec", "0x7925Edf88700d82Fe3779cc98F8B8b686b6Ac82a", "0x7bd5Bbda0a483A62dcA7d8Ba72D53fd278069c02", "0x7EaBFE610657218bB4FD5620ED699B14dE305412", "0x7EaBFE610657218bB4FD5620ED699B14dE305412", "0x7EaBFE610657218bB4FD5620ED699B14dE305412", "0x80222ae86eA5F27435D3cc8616a9dfE19e01b95A", "0x8553f6Ca1993e502285fFa2053442c7ae921E2ae", "0x8AcF08a19c2858a1C9aF39b0e52b0a253bEA3717", "0x8cd40E173cA339AB333086300e26EB8538aA9866", "0x8Dbbca57Ea56290Efa14D835bBfd34fAF1d89753", "0x909a9160d4cd76505cee7F90E862A39541949f7f", "0x911657c57B58567922a5712AeC5878502Dcd779b", "0x9257C525A955497Ff54450Ca7C0E4359A0b44909", "0x953BB3AA4671b859298D98F70890b510176aDD63", "0x99e73A69536f7365fD4f2F2e5391f5dAa484b99b", "0x99fc8AD516FBCC9bA3123D56e63A35d05AA9EFB8", "0x9E174789337b6650fdBb77883f77FD99c2aF2f10", "0xa0D62722c4B8624D8005883ECAaAd491f0C212DE", "0xa3f81f0a82F2aF7549Ca9Dd10FA5e1D64d2Ea949", "0xa5430730f12F1128bf10dfBa38c8e00bc4d90Eea", "0xa9C538EA7cEc8e2e2dD9E869a36Af086F657708b", "0xaa3c0FAa24E67eBe9B73Fe3efaf9D06F9Ba57622", "0xaef7cDf5C0cE911E3491213A71bfC96cb28D5148", "0xB96E81f80b3AEEf65CB6d0E280b15FD5DBE71937", "0xbBA493459a48798b73522772AD31f2fdD854B534", "0xbCE555FfE94290912240c9036C37F49DC5cC2cb8", "0xC665A60F22dDa926B920DEB8FFAC0EF9D8a17460", "0xCc9B2b1f639F477371A5d784a389965041d7a33e", "0xda3c325aB45b30AeB476B026FE6A777443cA04f3", "0xe0D209b7324d982BACb757F724EbE00a9792aC28", "0xe3f663418251186888935dC1C4979FA3A3dA1bAC", "0xe3f663418251186888935dC1C4979FA3A3dA1bAC", "0xE4C6c46645988bBafd8ef6B4d1b60D969cC857C3", "0xE5CA890A0eF2F128EB3267e4711c6bf3306Ec024", "0xE6d4eA6c516b487f36e3F782f7043D7216a9C5bB", "0xeE74258438bcd2882fe907C91a5371dc5dD5b0eE", "0xeeA6486288645A2F8aA45FB00fbF5ba6a829a208", "0xEEF66e0feaD02bD972b77bFcf421eCb3D4699169", "0xf3860788D1597cecF938424bAABe976FaC87dC26", ]; let all_sets = [ [111222, 222660, 345600, 446600, 555200, 666110], [111114, 223366, 333311, 444661, 555520, 612400], [111260, 222331, 333316, 444136, 551120, 661340], [111110, 222220, 333330, 444440, 555550, 666660], [111111, 222211, 331000, 444113, 551160, 610000], [111134, 222234, 333552, 444160, 552400, 612340], [111145, 222400, 333556, 444225, 555223, 661235], [111460, 223460, 335560, 444420, 555246, 666225], [112256, 225600, 340000, 444446, 555540, 666334], [123450, 222450, 350000, 444660, 555664, 666644], [111345, 235600, 356000, 444300, 551000, 613000], [111200, 222100, 335526, 444435, 555126, 661122], [140000, 222245, 333300, 445500, 551230, 663315], [111236, 221300, 335600, 416000, 555553, 662500], [112200, 222140, 336650, 444230, 556600, 666124], [111122, 245000, 346000, 445523, 555111, 666222], [115524, 224600, 334000, 441300, 553000, 666624], [111443, 235000, 335000, 415000, 556000, 661300], [113344, 222460, 333340, 445560, 555442, 662340], [112246, 222236, 333120, 441136, 513000, 661350], [111660, 222216, 335500, 444423, 555666, 666450], [113326, 221346, 333345, 442350, 555522, 661345], [111112, 222110, 331246, 441125, 551130, 666230], [111300, 222134, 333221, 444150, 551166, 666625], [113350, 222260, 335540, 446623, 556620, 666630], [113300, 221400, 333100, 443500, 551400, 666100], [111140, 223344, 336640, 445510, 551240, 666613], [111330, 222550, 333240, 444120, 555110, 666650], [112346, 222333, 333224, 444350, 552360, 666553], [111166, 222221, 333310, 444456, 555116, 666114], [120000, 224450, 333554, 460000, 555334, 623000], [114423, 222156, 314500, 444552, 555332, 666220], [124000, 221000, 333000, 444000, 552000, 666000], [111230, 224430, 332560, 445530, 552200, 612000], [111334, 224435, 334460, 444555, 553460, 666125], [112300, 223314, 333126, 441560, 555234, 661150], [111240, 224455, 333456, 444335, 552216, 666500], [111246, 222215, 335510, 444450, 555130, 661134], [111000, 222000, 336000, 441000, 555000, 661100], [112350, 222356, 333344, 446650, 555226, 661120], [111446, 222255, 333146, 444336, 555236, 666250], [111450, 221360, 333356, 446610, 551140, 666200], [111256, 223450, 335512, 444360, 555134, 666440], [124500, 222300, 331600, 426000, 526000, 666445], [114560, 222213, 331245, 444415, 555240, 666551], [111456, 222160, 333450, 441160, 551360, 665000], [111120, 223350, 333140, 441600, 555300, 661240], [123400, 222145, 334415, 444100, 552460, 666145], [111234, 223356, 336600, 441200, 551134, 666443], [111156, 222446, 333551, 444416, 555663, 663314], [111550, 221450, 333350, 446000, 512000, 662215], [111124, 222223, 333333, 444455, 555552, 666645], [111130, 221350, 331145, 443600, 555443, 612300], [114420, 222444, 333331, 444413, 556613, 662230], [114500, 222551, 336624, 446635, 556634, 666224], [113340, 221460, 333325, 442560, 551234, 661245], [111556, 222600, 333160, 445566, 513600, 666350], [111123, 224410, 333124, 444112, 555346, 666331], [111335, 223400, 333600, 444332, 555512, 666612], [111133, 222553, 333400, 445536, 555330, 663450], [111333, 223316, 333666, 444410, 556612, 661130], [114426, 223000, 334466, 446620, 551460, 666622], [123000, 240000, 335520, 456000, 510000, 620000], [111146, 222335, 333555, 441236, 555662, 613400], [113325, 222334, 333116, 444330, 552300, 663500], [110000, 230000, 360000, 440000, 560000, 661000], [111336, 222235, 331260, 444412, 555221, 666123], [123500, 224436, 345000, 441156, 555224, 666235], [114600, 224500, 331200, 444250, 554600, 663000], [111116, 222233, 333322, 444666, 555551, 666150], [112240, 222115, 331240, 444662, 555136, 661133], [113456, 222556, 333360, 444443, 551340, 666550], [111224, 222116, 333315, 444422, 555544, 666130], [100000, 200000, 300000, 400000, 500000, 600000], [111560, 223560, 336625, 444663, 552214, 661200], [111552, 222244, 333332, 444556, 555222, 666134], [113460, 222250, 336645, 444436, 555524, 661450], [111350, 222136, 333125, 444425, 555260, 662200], [113500, 224000, 333200, 444200, 555600, 662300], [134000, 224415, 331146, 444600, 555400, 662245], [111665, 222665, 333335, 444466, 555523, 666113], [113400, 222222, 333326, 444441, 555554, 666634], [111664, 234600, 334456, 442500, 555660, 666335], [111663, 221600, 333225, 441500, 555556, 666234], [115600, 222445, 333246, 442600, 551300, 663400], [112235, 222146, 333560, 442256, 552340, 666623], [111160, 222440, 333334, 444411, 512360, 662450], [111250, 222210, 334400, 444500, 555114, 660000], [112000, 220000, 330000, 450000, 555560, 666330], ];
var seed = parseInt(tokenData.hash.slice(0, 16), 16); let projectNumber = Math.floor(parseInt(tokenData.tokenId) / 1000000); let walletCount = parseInt(tokenData.tokenId) % 1000000; let vertX = [0.59375, 0.40625, 0.59375, 0.40625, 0.59375, 0.40625]; let vertY = [0.75, 0.75, 0.5, 0.5, 0.25, 0.25]; let horiX = [0.75, 0.5, 0.25, 0.75, 0.5, 0.25]; let horiY = [0.59375, 0.59375, 0.59375, 0.40625, 0.40625, 0.40625]; let vertical; let sixX, sixY; let multiplyOn = false; let mostShapeArr = [0, 0, 0, 0, 0, 0]; let shapesNames = ["Sun", "Shard", "Cargo", "Hive", "Pyramid", "Moon"]; p5.disableFriendlyErrors = true; let rezs = [150, 200, 300]; let rezIndex = 2; let lineThickness; let lineDepth; let lineLength; let lineSpacing; let depth = 255.0; let displayRed = true; let displayGreen = true; let displayBlue = true; let stillLifeDim = -1; let stillLifeDepthNeg = 0; let stillLifeDepthPos = 0; let depthScalar = 1.0; let speedScalar = 1.0; let speeds = [0.25, 0.5, 1.0, 2.0, 0.0]; let speedIndex = 2; let SEED = 0; let lengthScalar = 1.3; let combination = []; let angle = 0.0; let alphapix; let overlay; let cityNum; let cla, cny, cberlin, ccdmx, clondon, ctokyo; let s1, s2, s3, s4; let sc; let foregrounds = []; let bColor = 246; let shapes = []; let gl; let stillLifePO2 = 2; let ext; let pgl; let viewDiagram = false; let infoOverlay = false; let viewMatrix; let modelViewMatrix; let dispMapTexture; let CDMXSpin = 1; const vertCode = `precision highp float; uniform mat4 uViewMatrix; uniform mat4 uProjectionMatrix; uniform mat4 uModelViewMatrix; uniform mat4 uModelViewProjectionMatrix; uniform vec2 canvasSize; uniform float stillLifeDim; uniform float stillLifePO2; uniform float stillLifeDepthNeg; uniform float stillLifeDepthPos; uniform float depthScalar; uniform float lineThickness; uniform float lineDepth; uniform float lineLength; uniform vec3 color; uniform sampler2D displacementMap; attribute vec3 coordinates; float map(float value, float min1, float max1, float min2, float max2) { return min2 + (value - min1) * (max2 - min2) / (max1 - min1); } struct Line { vec3 start; vec3 end; }; Line getLineFromDisplacementMap(int x_origin, int y_origin) { Line l; vec2 imageCoords = vec2(x_origin, y_origin); imageCoords.x += .5; imageCoords.y += .5; vec2 samplePos = imageCoords.xy/stillLifePO2; vec4 dispMapColor = texture2D(displacementMap, samplePos); float maxEdge = max(canvasSize.x, canvasSize.y); float x = float(x_origin); float y = float(y_origin); float z = map(dot(dispMapColor.xyz, color), 0.0, 1.0, -stillLifeDepthNeg, stillLifeDepthPos); l.start.x = map(x, 0.0, stillLifeDim, -maxEdge / 2.0, maxEdge / 2.0); l.start.y = map(y, 0.0, stillLifeDim, -maxEdge / 2.0, maxEdge / 2.0); l.start.z = -z; l.end.x = map(x, 0.0, stillLifeDim, -maxEdge / 2.0, maxEdge / 2.0) - lineDepth; l.end.y = map(y, 0.0, stillLifeDim, -maxEdge / 2.0, maxEdge / 2.0) - lineDepth; l.end.z = -lineLength - z; return l; } void main() { bool lineStart = false; if (coordinates.y == 0.0) lineStart = true; if (coordinates.y == 1.0) lineStart = true; if (coordinates.y == 2.0) lineStart = false; if (coordinates.y == 3.0) lineStart = true; if (coordinates.y == 4.0) lineStart = false; if (coordinates.y == 5.0) lineStart = false; int imageCoordsY = int(floor(coordinates.x / stillLifeDim)); int imageCoordsX = int(floor(coordinates.x - float(imageCoordsY) * stillLifeDim)); Line l = getLineFromDisplacementMap(imageCoordsX, imageCoordsY); vec3 vertexPosition; if (lineStart) { vertexPosition = l.start; } else { vertexPosition = l.end; } vec4 finalPos = vec4(vertexPosition, 1.0); finalPos = uModelViewProjectionMatrix * finalPos; vec4 projLineStart = uModelViewProjectionMatrix * vec4(l.start, 1.0); vec4 projLineEnd = uModelViewProjectionMatrix * vec4(l.end, 1.0); vec2 lineDirection = projLineStart.xy - projLineEnd.xy; lineDirection = vec2(-lineDirection.y, lineDirection.x); float maxEdge = max(canvasSize.x, canvasSize.y); lineDirection /= canvasSize / maxEdge; vec2 displacement = normalize(lineDirection); displacement /= canvasSize; displacement *= lineThickness; if (coordinates.y == 0.0) finalPos.xy -= displacement; if (coordinates.y == 2.0) finalPos.xy -= displacement; if (coordinates.y == 5.0) finalPos.xy -= displacement; if (coordinates.y == 1.0) finalPos.xy += displacement; if (coordinates.y == 3.0) finalPos.xy += displacement; if (coordinates.y == 4.0) finalPos.xy += displacement; finalPos.z = 0.0; gl_Position = finalPos; } `; const fragCode = `precision highp float; uniform vec3 color; void main() { gl_FragColor = vec4(color, 1.0); } `; let triangle_buffer; let numTris; function setupGeometry() { let triangles = []; numTris = 0; for (let y = 0; y < rezs[rezIndex]; y += 1) { for (let x = 0; x < rezs[rezIndex]; x += 1) { triangles.push(x + y * stillLifeDim, 0, 0); triangles.push(x + y * stillLifeDim, 1, 0); triangles.push(x + y * stillLifeDim, 2, 0); triangles.push(x + y * stillLifeDim, 3, 0); triangles.push(x + y * stillLifeDim, 4, 0); triangles.push(x + y * stillLifeDim, 5, 0); numTris += 6; } } triangle_buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, triangle_buffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangles), gl.STATIC_DRAW); gl.bindBuffer(gl.ARRAY_BUFFER, null); } function setupShapes() { let sss = 0.3; shapes = []; let currSet = all_sets[walletCount]; mostShapeArr = [0, 0, 0, 0, 0, 0]; if (vertical) { sixX = vertX; sixY = vertY; } else { sixX = horiX; sixY = horiY; } let currShapesArr = []; for (let currCombo = 0; currCombo < currSet.length; currCombo++) { setupCombination(currSet[currCombo]); for (let i = 0; i < combination.length; i++) { currShapesArr.push( new VShape( -stillLifeDim * sixX[currCombo], -stillLifeDim * sixY[currCombo], stillLifeDim * sss, combination[i] ) ); } shapes.push(currShapesArr); currShapesArr = []; } theDetails(); } function theDetails() { let maxSide = max(width, height); if (maxSide < 400) { depthScalar = map(maxSide, 50, 400, 0.05, 0.3); } else { depthScalar = map(maxSide, 400, 3840, 0.3, 2.0); } stillLifeDepthNeg = 255.0 / 4; stillLifeDepthPos = 255.0 / 4; lengthScalar = 1.0; let cityDigit = mostShapeArr.indexOf(Math.max(...mostShapeArr)) + 1; if (cityDigit == 1) { tokyoParams(); } else if (cityDigit == 2) { berlinParams(); } else if (cityDigit == 3) { londonParams(); } else if (cityDigit == 4) { nycParams(); } else if (cityDigit == 5) { cdmxParams(); } else { laParams(); } } let shaderProgram; function setupShaders() { let vertShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertShader, vertCode); gl.compileShader(vertShader); const vertError = gl.getShaderInfoLog(vertShader); if (vertError.length > 0) { throw vertError; } let fragShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragShader, fragCode); gl.compileShader(fragShader); const fragError = gl.getShaderInfoLog(fragShader); if (fragError.length > 0) { throw fragError; } shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram, vertShader); gl.attachShader(shaderProgram, fragShader); gl.linkProgram(shaderProgram); } function createDisplacementMapTexture() { dispMapTexture = gl.createTexture(); while (stillLifePO2 < stillLifeDim) { stillLifePO2 *= 2; } } function transferDisplacementMap() { let img = alphapix.get(); img.loadPixels(); let uvTexture = Array(stillLifePO2 * stillLifePO2 * 4).fill(255); const randomStuff = new Uint8Array(uvTexture); for (let x = 0; x < stillLifeDim; ++x) { for (let y = 0; y < stillLifeDim; ++y) { const index1 = 4 * (y * stillLifePO2 + x); const index2 = 4 * (y * stillLifeDim + x); randomStuff[index1 + 0] = img.pixels[index2 + 0]; randomStuff[index1 + 1] = img.pixels[index2 + 1]; randomStuff[index1 + 2] = img.pixels[index2 + 2]; } } gl.bindTexture(gl.TEXTURE_2D, dispMapTexture); gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, stillLifePO2, stillLifePO2, 0, gl.RGBA, gl.UNSIGNED_BYTE, randomStuff ); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.bindTexture(gl.TEXTURE_2D, null); gl.activeTexture(gl.TEXTURE2); gl.bindTexture(gl.TEXTURE_2D, dispMapTexture); const displaceMapLocation = gl.getUniformLocation( shaderProgram, "displacementMap" ); gl.uniform1i(displaceMapLocation, 2); } function setMatrices() { const viewMatrix = this._renderer._curCamera.cameraMatrix; const projectionMatrix = this._renderer.uPMatrix; const modelViewMatrix = this._renderer.uMVMatrix; const modelViewProjectionMatrix = modelViewMatrix.copy(); modelViewProjectionMatrix.mult(projectionMatrix); gl.uniformMatrix4fv( gl.getUniformLocation(shaderProgram, "uViewMatrix"), false, viewMatrix.mat4 ); gl.uniformMatrix4fv( gl.getUniformLocation(shaderProgram, "uProjectionMatrix"), false, projectionMatrix.mat4 ); gl.uniformMatrix4fv( gl.getUniformLocation(shaderProgram, "uModelViewMatrix"), false, modelViewMatrix.mat4 ); gl.uniformMatrix4fv( gl.getUniformLocation(shaderProgram, "uModelViewProjectionMatrix"), false, modelViewProjectionMatrix.mat4 ); } function setUniforms() { gl.uniform2f( gl.getUniformLocation(shaderProgram, "canvasSize"), width, height ); gl.uniform1f( gl.getUniformLocation(shaderProgram, "stillLifeDim"), stillLifeDim ); gl.uniform1f( gl.getUniformLocation(shaderProgram, "stillLifePO2"), stillLifePO2 ); gl.uniform1f( gl.getUniformLocation(shaderProgram, "depthScalar"), depthScalar ); gl.uniform1f( gl.getUniformLocation(shaderProgram, "stillLifeDepthNeg"), stillLifeDepthNeg * depthScalar ); gl.uniform1f( gl.getUniformLocation(shaderProgram, "stillLifeDepthPos"), stillLifeDepthPos * depthScalar ); gl.uniform1f( gl.getUniformLocation(shaderProgram, "lineThickness"), lineThickness ); gl.uniform1f(gl.getUniformLocation(shaderProgram, "lineLength"), lineLength); gl.uniform1f(gl.getUniformLocation(shaderProgram, "lineDepth"), lineDepth); } function beginLinesShader() { gl.useProgram(shaderProgram); gl.bindBuffer(gl.ARRAY_BUFFER, triangle_buffer); transferDisplacementMap(); setUniforms(); const coord = gl.getAttribLocation(shaderProgram, "coordinates"); gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(coord); gl.enable(gl.BLEND); gl.disable(gl.DEPTH_TEST); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); gl.viewport(0, 0, canvas.width, canvas.height); } function endLinesShader() { gl.useProgram(null); } function drawLines() { beginLinesShader(); setMatrices(); gl.uniform3f(gl.getUniformLocation(shaderProgram, "color"), 1, 1, 0); if (displayRed) { gl.drawArrays(gl.TRIANGLES, 0, numTris); } translate(lineSpacing, 0.0, 0.1); setMatrices(); gl.uniform3f(gl.getUniformLocation(shaderProgram, "color"), 0, 1, 1); if (displayGreen) { gl.drawArrays(gl.TRIANGLES, 0, numTris); } translate(lineSpacing, 0.0, 0.1); setMatrices(); gl.uniform3f(gl.getUniformLocation(shaderProgram, "color"), 1, 0, 1); if (displayBlue) { gl.drawArrays(gl.TRIANGLES, 0, numTris); } endLinesShader(); } function setupTransform() { ortho(); scale(1.45); rotateY(0.33); rotateX(-0.33); } function setupCombination(code) { combination = []; let comb = str(code); for (let i = 0; i < comb.length; i++) { let char = comb[i]; if (char != "0") { mostShapeArr[char - 1] += 1; let c = int(comb[i]) - 1; combination.push(c); } } } function defineColors() { let aaa = 254; ctokyo = color(227, 143, 53, aaa); cberlin = color(53, 155, 227, aaa); clondon = color(231, 71, 71, aaa); cny = color(166, 79, 206, aaa); ccdmx = color(76, 205, 82, aaa); cla = color(238, 211, 30, aaa); foregrounds = [ctokyo, cberlin, clondon, cny, ccdmx, cla]; s1 = color(255, 226, 204); s2 = color(204, 255, 226); s3 = color(225, 204, 226); s4 = color(164, 204, 255); sc = [s1, s2, s3, s4]; } function changeAspectRatio() { if (vertical) { sixX = horiX; sixY = horiY; } else { sixX = vertX; sixY = vertY; } vertical = !vertical; for (let i = 0; i < shapes.length; i++) { for (let j = 0; j < shapes[i].length; j++) { shapes[i][j].changeXandY( -stillLifeDim * sixX[i], -stillLifeDim * sixY[i] ); } } } function allCenter() { for (let i = 0; i < shapes.length; i++) { for (let j = 0; j < shapes[i].length; j++) { shapes[i][j].changeXandY(-stillLifeDim * 0.5, -stillLifeDim * 0.5); shapes[i][j].changeScale(3.0); } } } function allRandom() { for (let i = 0; i < shapes.length; i++) { for (let j = 0; j < shapes[i].length; j++) { shapes[i][j].changeXandY( -stillLifeDim * r.rb(0, 1), -stillLifeDim * r.rb(0, 1) ); shapes[i][j].changeScale(1.5); } } } function allGrid() { for (let i = 0; i < shapes.length; i++) { for (let j = 0; j < shapes[i].length; j++) { shapes[i][j].changeXandY( -stillLifeDim * sixX[i], -stillLifeDim * sixY[i] ); shapes[i][j].changeScale(1.0); } } } function windowResized() { resizeCanvas(windowWidth, windowHeight); if (windowWidth > windowHeight && vertical) { changeAspectRatio(); } else if (windowHeight > windowWidth && !vertical) { changeAspectRatio(); } } function setup() { createCanvas(windowWidth, windowHeight, WEBGL); if (windowWidth > windowHeight) { vertical = false; } else if (windowHeight > windowWidth) { vertical = true; } r = new RND(seed); defineColors(); imageMode(CENTER); gl = document.getElementById("defaultCanvas0").getContext("webgl"); stillLifeDim = rezs[rezIndex]; alphapix = createGraphics(stillLifeDim, stillLifeDim, WEBGL); pgl = alphapix._renderer.GL; pgl.disable(gl.DEPTH_TEST); overlay = createGraphics(1200, 1200); setupShaders(); doIt(); } function doIt() { stillLifeDim = rezs[rezIndex]; alphapix.resizeCanvas(stillLifeDim, stillLifeDim); setupShapes(); setupGeometry(); createDisplacementMapTexture(); createStillLife(); } function createGround() { if (speedIndex != 4) { angle += 0.0005; } let ss = map(sin(angle), -1, 1, 0, 1); let c1 = lerpColor(sc[0], sc[1], ss); let c2 = lerpColor(sc[1], sc[2], ss); let c3 = lerpColor(sc[2], sc[3], ss); let c4 = lerpColor(sc[3], sc[1], ss); alphapix.background(255); alphapix.blendMode(BLEND); alphapix.beginShape(); alphapix.fill(c1); alphapix.vertex(-alphapix.width / 2, -alphapix.height / 2); alphapix.fill(c2); alphapix.vertex(alphapix.width / 2, -alphapix.height / 2); alphapix.fill(c3); alphapix.vertex(alphapix.width / 2, alphapix.height / 2); alphapix.fill(c4); alphapix.vertex(-alphapix.width / 2, alphapix.height / 2); alphapix.endShape(); } function createStillLife() { createGround(); if (multiplyOn) { alphapix.blendMode(MULTIPLY); } else { alphapix.blendMode(BLEND); } for (let i = 0; i < shapes.length; i++) { for (let j = 0; j < shapes[i].length; j++) { shapes[i][j].move(); shapes[i][j].display(alphapix); } } } function makeOverlay() { push(); switch (cityNum) { case 1: overlay.background(128, 255, 128); break; case 2: overlay.background(204, 204, 255); break; case 3: overlay.background(255, 255, 0); break; case 4: overlay.background(255, 0, 255); break; case 5: overlay.background(0, 255, 255); break; case 6: overlay.background(255, 191, 64); break; default: overlay.background(0); } const totalShapes = mostShapeArr.reduce((a, b) => a + b, 0); const mostUsed = Math.max(...mostShapeArr); const indices = mostShapeArr.reduce((result, element, index) => { if (element == mostUsed) { result.push(index); } return result; }, []); let totalLinesPx = 568 + 36 + indices.length * 44; let lineCoord = (1200 - totalLinesPx) / 2; fill(0, 0, 0); noStroke(); overlay.textAlign(CENTER, TOP); overlay.textFont("Arial", 36); overlay.text("Wallet:", 600, lineCoord); lineCoord += 44; overlay.text(all_wallets[walletCount], 600, lineCoord); lineCoord += 72; overlay.text("Sets:", 600, lineCoord); lineCoord += 44; overlay.text(all_sets[walletCount].join(" "), 600, lineCoord); lineCoord += 72; overlay.text(totalShapes.toString() + " Total Shapes: ", 600, lineCoord); for (let i = 0; i < mostShapeArr.length; i++) { lineCoord += 44; if (mostShapeArr[i] == 1) { overlay.text( mostShapeArr[i].toString() + " " + shapesNames[i], 600, lineCoord ); } else { overlay.text( mostShapeArr[i].toString() + " " + shapesNames[i] + "s", 600, lineCoord ); } } lineCoord += 72; overlay.text("Most Used Shape:", 600, lineCoord); if (indices.length > 1) { for (let iShape = 0; iShape < indices.length; iShape++) { lineCoord += 44; if (mostUsed > 1) { overlay.text( mostUsed.toString() + " " + shapesNames[indices[iShape]].toString() + "s", 600, lineCoord ); } else { overlay.text( mostUsed.toString() + " " + shapesNames[indices[iShape]].toString(), 600, lineCoord ); } } } else { lineCoord += 44; overlay.text( mostUsed.toString() + " " + shapesNames[indices[0]].toString() + "s", 600, lineCoord ); } pop(); } function draw() { let scaleFactor = max(width, height) / 1200.0; if (rezIndex == 2) { lineThickness = 1.66 * scaleFactor; lineLength = 3.0 * lengthScalar * scaleFactor; } else if (rezIndex == 0) { lineThickness = 3.33 * scaleFactor; lineLength = 8.0 * lengthScalar * scaleFactor; } else { lineThickness = 2.22 * scaleFactor; lineLength = 12.0 * lengthScalar * scaleFactor; } lineDepth = 2 * scaleFactor; lineSpacing = 2.22 * scaleFactor; createStillLife(); background(bColor); push(); setupTransform(); drawLines(); pop(); if (viewDiagram) { fill(255); noStroke(); rect(0, 0, -stillLifeDim / 2, -stillLifeDim / 2); image(alphapix, 0, 0); } if (infoOverlay) { push(); makeOverlay(); rectMode(CENTER); fill(255); noStroke(); rect(0, 0, max(width, height) / 3, max(width, height) / 3); image(overlay, 0, 0, max(width, height) / 3, max(width, height) / 3); pop(); } if (speedIndex != 4) { CDMXSpin++; } } class VShape { constructor(xin, yin, uin, win) { this.scale = 1.0; this.targetScale = 1.0; this.scaleStep = 0.2; this.dia = uin * 0.75; this.mdia = uin * 0.8; this.rdia = uin * 0.66; this.ddia = uin * 0.55; this.tdia = uin * 0.8; this.tdia2 = uin * 0.7; this.hu = uin * 0.5; this.qr1 = uin * 0.3; this.qr2 = uin * 0.2; this.sr = uin * 0.4; this.unit = stillLifeDim; this.x = xin; this.y = yin; this.rx = this.x + (this.unit - this.rdia) / 2; this.ry = this.y + (this.unit - this.rdia) / 2; this.cx = this.x + this.unit / 2; this.cy = this.y + this.unit / 2; this.cindex = win; this.sindex = win; this.movex = r.rb(0, TWO_PI); this.movey = r.rb(0, TWO_PI); this.hexx = uin * 0.2; this.hexy = uin * 0.346; this.moonAngle = r.rb(0, TWO_PI); this.moveyval = r.rb(0.0005, 0.002); this.movexval = r.rb(0.0005, 0.002); if (r.rb(1) > 0.5) { this.moveyval *= -1; } if (r.rb(1) > 0.5) { this.movexval *= -1; } } resetScale() { this.targetScale = 1.0; } upScale() { this.targetScale += this.scaleStep; } downScale() { this.targetScale -= this.scaleStep; this.targetScale = max(0.0, this.targetScale); } changeScale(newScale) { this.targetScale = newScale; } move() { this.movex += this.movexval * speedScalar; this.movey += this.moveyval * speedScalar; this.scale = (this.targetScale - this.scale) * 0.05 + this.scale; } changeXandY(xin, yin) { this.x = xin; this.y = yin; this.rx = this.x + (this.unit - this.rdia) / 2; this.ry = this.y + (this.unit - this.rdia) / 2; this.cx = this.x + this.unit / 2; this.cy = this.y + this.unit / 2; } display(pg) { if (this.sindex == 0) { this.sTokyo(pg); } else if (this.sindex == 1) { this.sBerlin(pg); } else if (this.sindex == 2) { this.sLondon(pg); } else if (this.sindex == 3) { this.sNYC(pg); } else if (this.sindex == 4) { this.sCDMX(pg); } else if (this.sindex == 5) { this.sLA(pg); } } sTokyo(pg) { pg.noStroke(); pg.push(); pg.translate(this.cx, this.cy); pg.scale(this.scale); pg.rotateY(this.movey); pg.rotateX(this.movex); pg.fill(foregrounds[this.cindex]); pg.ellipse(0, 0, this.dia, this.dia); pg.pop(); } sBerlin(pg) { pg.noStroke(); pg.fill(foregrounds[this.cindex]); pg.push(); pg.beginShape(); pg.translate(this.cx, this.cy); pg.scale(this.scale); pg.rotateX(this.movex); pg.rotateY(this.movey); pg.vertex(-this.qr1, -this.hu); pg.vertex(this.qr1, -this.qr2); pg.vertex(this.qr1, this.hu); pg.vertex(-this.qr1, this.qr2); pg.endShape(); pg.pop(); } sLondon(pg) { pg.push(); pg.translate(this.rx + this.rdia / 2, this.ry + this.rdia / 2); pg.scale(this.scale); pg.rotateY(this.movey); pg.rotateX(this.movex); pg.noStroke(); pg.fill(foregrounds[this.cindex]); pg.beginShape(); pg.vertex(-this.rdia / 2, -this.rdia / 2); pg.vertex(this.rdia / 2, -this.rdia / 2); pg.vertex(this.rdia / 2, this.rdia / 2); pg.vertex(-this.rdia / 2, this.rdia / 2); pg.endShape(); pg.pop(); } sNYC(pg) { pg.push(); pg.translate(this.rx + this.rdia / 2, this.ry + this.rdia / 2); pg.scale(this.scale); pg.rotateY(this.movey); pg.rotateX(this.movex); pg.noStroke(); pg.fill(foregrounds[this.cindex]); pg.beginShape(); pg.vertex(this.hexx, -this.hexy); pg.vertex(this.hexx * 2, 0); pg.vertex(this.hexx, this.hexy); pg.vertex(-this.hexx, this.hexy); pg.vertex(-this.hexx * 2, 0); pg.vertex(-this.hexx, -this.hexy); pg.endShape(); pg.pop(); } sCDMX(pg) { pg.push(); pg.translate(this.rx + this.rdia / 2, this.ry + this.rdia / 2.66); pg.scale(this.scale); pg.rotateY(this.movey); pg.rotateX(this.movex); pg.rotateZ(CDMXSpin / 1000.0); pg.noStroke(); pg.fill(foregrounds[this.cindex]); pg.beginShape(); pg.vertex(0, -this.tdia / 2); pg.vertex(this.tdia / 2, this.tdia2 / 2); pg.vertex(-this.tdia / 2, this.tdia2 / 2); pg.endShape(); pg.pop(); } sLA(pg) { pg.noStroke(); pg.fill(foregrounds[this.cindex]); pg.push(); pg.translate(this.cx, this.cy); pg.scale(this.scale); pg.rotate(this.moonAngle); pg.rotateX(this.movex); pg.rotateY(this.movey); pg.rotateZ(CDMXSpin / 1000.0); pg.arc(0, 0, this.mdia, this.mdia, 0.7, TWO_PI - 0.7, CHORD); pg.pop(); } }
89 Bright × Empty Rooms is a new series for collectors of a full set of 923 Empty Rooms. 923 Empty Rooms is an artwork about simulation and the history of visual representation and abstraction. Each room is a space to explore. See the key commands listed below. Each of the 89 Bright × Empty Rooms contains six complete rooms from 923 Empty Rooms, one for each city: Tokyo, Berlin, London, New York, Mexico City, and Los Angeles. 89 Bright × Empty Rooms is a further evolution of An Empty Room, commissioned by the Los Angeles County Museum of Art (LACMA) for the Coded: Art Enters the Computer Age, 1952–1982 exhibition.
A temporary arrangement of material is exactly as it sounds. Run a set of shapes through an algorithm and the same through human hands. Place them side by side, and in the space between paint, thread, pixel, and code we find that no iteration is final.
="start"?"end":"start"](d,y),r=s.rng(0,this.children.length-1),o={start:(l,h)=>0,middle:(l,h)=>l/2-h/2,end:(l,h)=>l-h,"start + random opposite":(l,h,d)=>t("end",d==r,l,h),"end + random opposite":(l,h,d)=>t("start",d==r,l,h),"start + first opposite":(l,h,d)=>t("end",d==0,l,h),"end + first opposite":(l,h,d)=>t("start",d==0,l,h),"start + last opposite":(l,h,d)=>t("end",d==this.children.length-1,l,h),"end + last opposite":(l,h,d)=>t("start",d==this.children.length-1,l,h),"start + half opposite":(l,h,d)=>t("end",d>=this.children.length/2,l,h),"end + half opposite":(l,h,d)=>t("start",d>=this.children.length/2,l,h),"start + alternate opposite":(l,h,d)=>t("end",d%2==0,l,h),"end + alternate opposite":(l,h,d)=>t("start",d%2==0,l,h)},u=o[this.item.align],m=o[this.item.justify],A=this.children.reduce((l,h)=>l+h.item.w,0),p=this.children.reduce((l,h)=>l+h.item.h,0);let w=e+m(this.item.w,A),E=i+m(this.item.h,p);for(const[l,h]of this.children.entries())this.item.side=="w"?h.layout(w,i+u(this.item.h,h.item.h,l),a-20-l):h.layout(e+u(this.item.w,h.item.w,l),E,a-20-l),w+=h.item.w,E+=h.item.h}}class D{constructor(e,i,a){this.x=0,this.y=0,this.z=0,this.w=e,this.h=i,this.isContainer=!1,this.rngs=null,this.margin=s.choice(Array.from({length:(a.shapegen.marginmax-.1)/.05+1},(t,r)=>.1+r*.05))*a.inch,this.colors=null,this.skip=!1,this.cutout=!1,this.reuse=!1,this.rotated=!1,this.offset=!1,this.type="normal"}_divisions(e,i,a,t,r){return Array.from({length:this[e]*a/i},(o,u)=>this[e]-i/a*u).filter(o=>o>=t).filter(o=>o<=r)}split(e,i,a){let t=new Array(i),r=0;for(let o=0;o<i;o++)t[o]=s.choice(this._divisions(e,a.inch,a.shapegen.factor,a.unit,this[e]-r-(i-o-1)*a.unit)),r+=t[o];if(e=="w")return t.map(o=>new D(o,this.h,a));if(e=="h")return t.map(o=>new D(this.w,o,a))}randomize(e){let i=s.choice(this._divisions("w",e.inch,e.shapegen.factor,Math.max(e.unit,this.w*e.shapegen.min),Math.max(e.unit*2,this.w*e.shapegen.max))),a=s.choice(this._divisions("h",e.inch,e.shapegen.factor,Math.max(e.unit,this.h*e.shapegen.min),Math.max(e.unit*2,this.h*e.shapegen.max)));const t=e.shapegen.aspectlimit;i>a*t&&(i=a*t),a>i*t&&(a=i*t),this.w=i||0,this.h=a||0;let r=s.rng(e.wonky.min,e.wonky.max);e.wonky.useGlobal&&(r=e.wonky.global),this.rngs={a:{x:+s.rng(0,r),y:+s.rng(0,r)},b:{x:-s.rng(0,r),y:+s.rng(0,r)},c:{x:-s.rng(0,r),y:-s.rng(0,r)},d:{x:+s.rng(0,r),y:-s.rng(0,r)},e:{x:+s.rng(0,r),y:+s.rng(0,r)},f:{x:-s.rng(0,r),y:+s.rng(0,r)},g:{x:-s.rng(0,r),y:-s.rng(0,r)},h:{x:+s.rng(0,r),y:-s.rng(0,r)},t:s.choice([15,30,45,60,75,90,105,120,135,150,165,195,210,225,240,255,270,285,300,315,330,345]),ox:0,oz:0},s.choice([!0,!1])?this.rngs.oz=s.rng(0,a*e.shapegen.offset_amt)*s.choice([1,-1]):this.rngs.ox=s.rng(0,i*e.shapegen.offset_amt)*s.choice([1,-1]),this.type=="canvasbg"?this.colors=s.choice(e.color.canvas_backgrounds):this.type=="container"?this.colors=s.choice(e.color.backgrounds):(this.colors=s.choice(e.color.options),e.color.options.splice(e.color.options.indexOf(this.colors),1),e.color.options.length==0&&(e.color.options=Array.from(e.color.refill))),this.shader=ne(s.choice(se),this.colors)}_createShape(e,i,a,t){const r=new THREE.BufferGeometry;return r.setIndex(i),r.setAttribute("position",new THREE.BufferAttribute(e,3)),r.setAttribute("uv",new THREE.BufferAttribute(a,2)),new THREE.Mesh(r,new THREE.ShaderMaterial({vertexShader:` varying vec2 v_uv; void main() { v_uv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); } `,fragmentShader:ce,uniforms:t}))}render(e){if(this.skip||this.w==0||this.h==0)return;const i=this.x,a=this.y,t=this.w,r=this.h,o=this.margin,u=e.canvasWidth,m=e.canvasHeight,A=-t/2+o,p=i+t>=u?t/2-o:t/2,w=-r/2+o,E=a+r>=m?r/2-o:r/2;let l=new Float32Array([A+this.rngs.a.x,0,w+this.rngs.a.y,p+this.rngs.b.x,0,w+this.rngs.b.y,p+this.rngs.c.x,0,E+this.rngs.c.y,A+this.rngs.d.x,0,E+this.rngs.d.y]),h=[0,2,1,0,3,2],d=new Float32Array([0,0,1,0,1,1,0,1]);const y={uSize:{value:new THREE.Vector2(p-A,E-w)},uResolution:{value:new THREE.Vector2(e.canvasWidth,e.canvasHeight)},uColor:{value:new THREE.Color(this.shader.color.main)},uColor2:{value:new THREE.Color(this.shader.color.grains)},uColor3:{value:new THREE.Color(this.shader.color.background)},uColorA:{value:new THREE.Color(this.shader.color.tennisone)},uColorB:{value:new THREE.Color(this.shader.color.tennistwo)},uType:{value:this.shader.type},uSeed:{value:this.shader.rng.seed},uVariety:{value:this.shader.rng.variety},uGrains:{value:this.shader.rng.grainy},uZoomX:{value:this.shader.rng.zoomx},uZoomY:{value:this.shader.rng.zoomy},uAlphaMin:{value:this.shader.rng.alphamin},uAlphaMax:{value:this.shader.rng.alphamax},uDir:{value:this.shader.rng.dir},isColor:{value:this.shader.isColor},isTexture:{value:this.shader.isTexture},isGrains:{value:this.shader.isGrains},isTennis:{value:this.shader.isTennis}};let f=this._createShape(l,h,d,y),x;if(this.cutout){const g=e.cutout.margin,Q=s.rng(-g/2,g/2),b=s.rng(-g/2,g/2);x=new Float32Array([A+g+Q+this.rngs.e.x,0,w+g+b+this.rngs.e.y,p-g+Q+this.rngs.f.x,0,w+g+b+this.rngs.f.y,p-g+Q+this.rngs.g.x,0,E-g+b+this.rngs.g.y,A+g+Q+this.rngs.h.x,0,E-g+b+this.rngs.h.y]);const j=[0,4,5,0,5,1,1,5,6,1,6,2,7,2,6,3,2,7,3,7,4,3,4,0],K=new Float32Array([...d,g/t,g/r,1-g/t,g/r,1-g/t,1-g/r,g/t,1-g/r]);f=this._createShape(new Float32Array([...l,...x]),j,K,y)}if(this.rotated&&(f.rotation.y=this.rngs.t*Math.PI/180),f.position.x=i+t/2,f.position.z=a+r/2,f.position.y=this.z,this.offset&&(f.position.x+=this.rngs.ox,f.position.z+=this.rngs.oz),this.type=="canvasbg"||this.type=="container"?(f.position.x-=e.canvasWidth/2,f.position.z-=e.canvasHeight/2,e.internal.scene.add(f)):e.internal.base.add(f),this.reuse){const g=this._createShape(x,h,d,y);let Q=s.rng(t*1,t*1.2)*s.choice([1,-1]),b=s.rng(t*1,t*1.2)*s.choice([1,-1]);(i+Q>e.canvasWidth||i-Q<0)&&(Q*=-1),(a+b>e.canvasHeight||a-b<0)&&(b*=-1),s.choice([!0,!1])?(g.position.x=Q,g.position.z=s.rng(0,r/8)*s.choice([1,-1])):(g.position.z=b,g.position.x=s.rng(0,t/8)*s.choice([1,-1])),f.add(g),e.temp.meshes.push([g.uuid,f.uuid])}e.temp.meshes.push([f.uuid])}}class de{constructor(e,i,a,t){this.x=0,this.y=0,this.z=0,this.w=e,this.h=i,this.ox=0,this.oy=0,this.isContainer=!0,this.side=a,this.align="start",this.justify="start",this.isRendered=!1,this.isContainedBg=!1,this.colors=null}randomize(e){this.align=s.choice(["start","middle","end"]),this.justify=s.choice(["start","middle","end"]),this.isRendered&&(this.align="middle",this.justify="middle"),e.align.useGlobal&&(this.align=e.align.global),e.justify.useGlobal&&(this.justify=e.justify.global),this.align=="force random"&&(this.align=s.choice(["start","middle","end"])),this.justify=="force random"&&(this.justify=s.choice(["start","middle","end"]))}render(e){if(!this.isRendered)return;const i=new D(this.w,this.h,e);let a=JSON.parse(JSON.stringify(e));this.isContainedBg&&(i.type="container",a.wonky.useGlobal=!0,a.wonky.global=e.wonky.bg),e.contained.rotated&&(i.rotated=!0),i.margin=0,i.randomize(a),this.colors=i.colors,i.z=this.z,i.x=this.x-e.contained.offsetContainer+this.ox,i.y=this.y-e.contained.offsetContainer+this.oy,i.w=this.w+e.contained.offsetContainer*2,i.h=this.h+e.contained.offsetContainer*2,i.render(e)}}let S,I,v;function ue(n){return J(this,null,function*(){console.log(n);const a=2048*n;let t={temp:{meshes:[]},internal:{base:new THREE.Object3D,rotationPivot:new THREE.Object3D,scene:S},sourceW:12,sourceH:16,canvasHeight:a,canvasWidth:Math.round(a*12/16),inch:a/16};return v=new THREE.WebGLRenderer({antialias:!0,preserveDrawingBuffer:!0}),v.setSize(t.canvasWidth,t.canvasHeight),I=new THREE.OrthographicCamera(-t.canvasWidth/2,t.canvasWidth/2,-t.canvasHeight/2,t.canvasHeight/2,1,2e3),I.position.set(0,-1e3,0),I.lookAt(0,0,0),S=new THREE.Scene,t.internal.scene=S,t.internal.base.position.x-=t.canvasWidth/2,t.internal.base.position.z-=t.canvasHeight/2,t.internal.rotationPivot.add(t.internal.base),S.add(t.internal.rotationPivot),yield le(),[t,v]})}function ge(n){let e=new L(new D(n.canvasWidth,n.canvasHeight,n));return(n.style=="contained"||n.style=="cutout")&&(e=new L(new D(n.canvasWidth-2*n.contained.offsetRender,n.canvasHeight-2*n.contained.offsetRender,n))),e}function Ae(n,e){let a=0,t=!0,r=[];for(;n.leafCount()<e.nshapes;){if(a+=1,a>99999){$("Could not fit all shapes",2e3);break}let o=s.rng(2,e.nshapes-n.leafCount()+1);o=Math.min(o,e.splitmax),e.subdivideOverride=="force both"&&(o=s.rng(2,e.nshapes-n.leafCount()),o=Math.max(o,2),o=Math.min(o,e.splitmax)),(e.subdivideOverride=="only width"||e.subdivideOverride=="only height")&&(o=e.nshapes-n.leafCount()+1);let u=s.choice(["w","h"]);e.subdivideOverride=="only width"&&(u="w"),e.subdivideOverride=="only height"&&(u="h"),e.subdivideOverride=="force both"&&r.length>0&&(r.includes("h")||(u="h"),r.includes("w")||(u="w")),e.subdivideOverride=="exclude only height"&&(r.includes("w")||(u="w")),e.subdivideOverride=="exclude only width"&&(r.includes("h")||(u="h")),r.push(u);const m=n.nodes().filter(w=>!w.item.isContainer&&w.item[u]>=e.unit*o);if(m.length==0)continue;const A=s.choice(m);A.item.split(u,o,e).forEach(w=>A.add(w)),A.item=new de(A.item.w,A.item.h,u,e),t&&((e.style=="contained"||e.style=="cutout")&&(A.item.isRendered=!0,A.item.isContainedBg=!0),t=!1)}if(e.shapegen.rotated){s.choice(n.shapes()).rotated=!0;for(const o of n.shapes())s.probability(e.shapegen.rotated_prob/100)&&(o.rotated=!0)}if(e.shapegen.offset){s.choice(n.shapes()).offset=!0;for(const o of n.shapes())s.probability(e.shapegen.offset_prob/100)&&(o.offset=!0)}if(e.shapegen.skip&&e.nshapes>4&&(s.choice(n.shapes()).skip=!0),e.style=="cutout"){s.choice(n.shapes()).cutout=!0;for(const o of n.shapes())s.probability(e.cutout.probability/100)&&(o.cutout=!0);for(const o of n.shapes())o.cutout==!0&&s.probability(e.cutout.reuse/100)&&(o.reuse=!0)}n.randomize(e),e.style=="contained"||e.style=="cutout"?n.layout(e.contained.offsetRender,e.contained.offsetRender):n.layout();for(const[o,u]of n.shapes().entries())u.z=-20-o*5}function me(n,e){const i=new D(e.canvasWidth,e.canvasHeight,e);let a=JSON.parse(JSON.stringify(e));if(a.wonky.useGlobal=!0,a.wonky.global=0,i.type="canvasbg",i.randomize(a),i.margin=0,i.z=0,i.x=-25,i.y=-25,i.w=e.canvasWidth+50,i.h=e.canvasHeight+50,i.render(e),e.shapegen.comp_rotated_prob){const t=s.choice([15,30,45,60,75,105,120,135,150,165,195,210,225,240,255,285,300,315,330,345]);e.internal.rotationPivot.rotation.y=t*Math.PI/180}else e.internal.rotationPivot.rotation.y=0*Math.PI/180;if(n.render(e),e.zoom.enable){let t={x:0,y:0},r=0;for(const o of n.shapes())o.skip||(t.x+=o.x+o.w/2,t.y+=o.y+o.h/2,r+=1);t.x/=r,t.y/=r,I.position.x=-e.canvasWidth/2+t.x,I.position.z=-e.canvasHeight/2+t.y,I.zoom=s.rng(e.zoom.min*10,e.zoom.max*10)/10,I.updateProjectionMatrix()}v.render(S,I)}const O={init:ue,subdivide:Ae,reset:ge,render:me};let c,T,B,W=!1;function M(){for(const[n,e]of c.temp.meshes){let i=c.internal.base.getObjectByProperty("uuid",n);if(i===void 0&&e!==void 0&&(i=c.internal.base.getObjectByProperty("uuid",e).getObjectByProperty("uuid",n)),i===void 0&&e===void 0){i=c.internal.scene.getObjectByProperty("uuid",n),i.geometry.dispose(),i.material.dispose(),c.internal.scene.remove(i);continue}i.geometry.dispose(),i.material.dispose(),c.internal.base.remove(i)}c.temp.meshes=[],B.renderLists.dispose(),_(),document.body.replaceChildren()}function k(n){return J(this,null,function*(){[c,B]=yield O.init(n),window.opts=c,document.body.appendChild(B.domElement),document.body.style.display="flex",document.body.style.alignItems="center",document.body.style.justifyContent="center";function e(){const i=window.innerWidth,a=window.innerHeight,t=window.innerHeight*c.sourceW/c.sourceH,r=window.innerWidth/c.sourceW*c.sourceH;a<i&&t<=i&&(B.domElement.style.height=`${a}px`,B.domElement.style.width=`${t}px`),a<i&&t>i&&(B.domElement.style.height=`${r}px`,B.domElement.style.width=`${i}px`),a>i&&r<=a&&(B.domElement.style.height=`${r}px`,B.domElement.style.width=`${i}px`),a>i&&r>a&&(B.domElement.style.height=`${a}px`,B.domElement.style.width=`${t}px`)}e(),window.addEventListener("resize",e,!0),fe()})}window.onload=k(1);function fe(){const n=tokenData.tokenId%100,e=ae[n];window.jsonName=e.n;function i(t){return t.map(r=>oe[re[r]])}const a=s.choice(e.pl);c=N(F({},c),{nshapes:e.m[0],style:e.m[2],unit:c.canvasHeight/c.sourceH*e.m[1],subdivideOverride:e.o[0],splitmax:e.o[1],zoom:{enable:s.probability(e.z[0]/100),min:e.z[1],max:e.z[2]},color:{options:Array.from(i(a[1])),refill:Array.from(i(a[1])),backgrounds:Array.from(i(a[0])),canvas_backgrounds:i(he)},wonky:{useGlobal:s.probability(20/100),global:s.rng(e.w[0],e.w[1]),min:e.w[0],max:e.w[1],bg:e.w[2]},shapegen:{min:e.s[0],max:e.s[1],aspectlimit:e.s[2],factor:e.s[3],skip:s.probability(e.p[2]/100),rotated:s.probability(e.p[0]/100),rotated_prob:e.p[1],comp_rotated_prob:!1,marginmax:e.s[4],offset:s.probability(e.s[5]/100),offset_prob:e.s[6],offset_amt:e.s[7]},align:{useGlobal:s.probability(12/100),global:s.choice(["start","middle","end"])},justify:{useGlobal:s.probability(12/100),global:s.choice(["start","middle","end"])},contained:{offsetRender:c.inch*s.rng(e.b[0]*4,e.b[1]*4)*.25,offsetContainer:c.inch/2,rotated:!1},cutout:{probability:e.c[0],margin:c.inch*s.rng(e.c[1]*8,e.c[2]*8)*.125,reuse:e.c[3]}}),c.contained.offsetRender==c.inch*.25&&(c.contained.offsetRender=0),c.contained.offsetRender==c.inch*.5&&(c.contained.offsetRender=.75),s.probability(12/100)&&(c.align.useGlobal=!0,c.justify.useGlobal=!0,c.align.global=s.choice(["start","middle","end"]),c.justify.global=c.align.global),e.o[2]!="no"&&(c.align.useGlobal=!0,c.align.global=e.o[2]),e.o[3]!="no"&&(c.justify.useGlobal=!0,c.justify.global=e.o[3]),T=O.reset(c),O.subdivide(T,c),we()}function we(){requestAnimationFrame(()=>{O.render(T,c),W&&ye()})}function ye(){const n=B.domElement;let e=document.createElement("a");e.setAttribute("download","render_bm.png");let a=n.toDataURL("image/png").replace(/^data:image\/png/,"data:application/octet-stream");e.setAttribute("href",a),e.click()}window.addEventListener("keyup",n=>{n.key=="1"&&(M(),W=!0,k(1)),n.key=="2"&&(M(),W=!0,k(2)),n.key=="3"&&(M(),W=!0,k(3))});
var P=Object.defineProperty,X=Object.defineProperties;var V=Object.getOwnPropertyDescriptors;var z=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,Z=Object.prototype.propertyIsEnumerable;var H=(n,e,i)=>e in n?P(n,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[e]=i,F=(n,e)=>{for(var i in e||(e={}))q.call(e,i)&&H(n,i,e[i]);if(z)for(var i of z(e))Z.call(e,i)&&H(n,i,e[i]);return n},N=(n,e)=>X(n,V(e));var J=(n,e,i)=>new Promise((a,t)=>{var r=m=>{try{u(i.next(m))}catch(A){t(A)}},o=m=>{try{u(i.throw(m))}catch(A){t(A)}},u=m=>m.done?a(m.value):Promise.resolve(m.value).then(r,o);u((i=i.apply(n,e)).next())});class U{constructor(e){this.useA=!1;let i=function(a){let t=parseInt(a.substr(0,8),16),r=parseInt(a.substr(8,8),16),o=parseInt(a.substr(16,8),16),u=parseInt(a.substr(24,8),16);return function(){t|=0,r|=0,o|=0,u|=0;let m=(t+r|0)+u|0;return u=u+1|0,t=r^r>>>9,r=o+(o<<3)|0,o=o<<21|o>>>11,o=o+m|0,(m>>>0)/4294967296}};this.prngA=new i(e.substr(2,32)),this.prngB=new i(e.substr(34,32));for(let a=0;a<1e6;a+=2)this.prngA(),this.prngB();this.hash=e.substr(2,64)}random(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}rng(e,i){return Math.floor(this.random()*(Math.floor(i)-Math.ceil(e)+1)+Math.ceil(e))}choice(e){return e[this.rng(0,e.length-1)]}probability(e){return!!e&&this.random()<=e}shuffle(e){let i=e.length,a,t;for(;i!==0;)t=Math.floor(this.random()*i),i-=1,a=e[i],e[i]=e[t],e[t]=a;return e}}let s=new U(tokenData.hash);function _(){s=new U(tokenData.hash)}function $(n,e=1e4){console.error(n),document.getElementById("error")&&(document.getElementById("error").innerText=`Error: ${n}`,setTimeout(()=>{document.getElementById("error").innerText=""},e))}var ee="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",G={},Y=String.fromCharCode;function ie(n,e){if(!G[n]){G[n]={};for(var i=0;i<n.length;i++)G[n][n.charAt(i)]=i}return G[n][e]}function te(n,e,i){var a=[],t=4,r=4,o=3,u="",m=[],A,p,w,E,l,h,d,y={val:i(0),position:e,index:1};for(A=0;A<3;A+=1)a[A]=A;function f(x,g=1){for(w=0,l=Math.pow(2,x),h=1;h!=l;)E=y.val&y.position,y.position>>=1,y.position==0&&(y.position=e,y.val=i(y.index++)),w|=(E>0?1:0)*h,h<<=1;g==1?d=Y(w):g==2&&(a[r++]=Y(w),d=r-1,t--)}switch(f(2,0),w){case 0:f(8);break;case 1:f(16);break;case 2:return""}for(a[3]=d,p=d,m.push(d);;){if(y.index>n)return"";switch(f(o),d=w){case 0:f(8,2);break;case 1:f(16,2);break;case 2:return m.join("")}if(t==0&&(t=Math.pow(2,o),o++),a[d])u=a[d];else if(d===r)u=p+p.charAt(0);else return null;m.push(u),a[r++]=p+u.charAt(0),t--,p=u,t==0&&(t=Math.pow(2,o),o++)}}function R(n){return te(n.length,32,function(e){return ie(ee,n.charAt(e))})}function ne(n,e){return{isColor:!0,isTexture:!0,isGrains:!0,isTennis:!0,type:C[n].type,color:{main:e[1],grains:e[2],background:e[0],tennisone:e[3],tennistwo:e[3]},rng:{seed:s.rng(1,1e5),variety:s.rng(1,1e3)/1e3,grainy:.2,zoomx:s.rng(C[n].zoomx.l*1e3,C[n].zoomx.u*1e3)/1e3,zoomy:s.rng(C[n].zoomy.l*1e3,C[n].zoomy.u*1e3)/1e3,alphamin:s.rng(C[n].alphamin.l*1e3,C[n].alphamin.u*1e3)/1e3,alphamax:s.rng(C[n].alphamax.l*1e3,C[n].alphamax.u*1e3)/1e3,dir:s.rng(0,4)},name:n}}const se=["map_streaks","cloudy","mod_legacy_streaks","cloudy_haze"],C={map_streaks:{type:0,zoomx:{l:.1,u:1.3},zoomy:{l:.1,u:.3},alphamin:{l:.8,u:1},alphamax:{l:.8,u:1}},cloudy:{type:1,zoomx:{l:.1,u:.5},zoomy:{l:.1,u:.6},alphamin:{l:.8,u:1},alphamax:{l:.8,u:1}},mod_legacy_streaks:{type:2,zoomx:{l:.1,u:.6},zoomy:{l:.1,u:1.4},alphamin:{l:.6,u:1},alphamax:{l:.7,u:1}},cloudy_haze:{type:3,zoomx:{l:.1,u:1.1},zoomy:{l:.1,u:.3},alphamin:{l:.6,u:1},alphamax:{l:.7,u:1}}},ae=JSON.parse(R("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=")),re=JSON.parse(R("NoIgRgNghgxg1gBgIwgDQgOYCcCmBPZNTXAgJiO3wQGYKSEAWOqgVmYIDZ2EB2dyAK45C6SnkHDyokhJpEwWAPYB3AHYjwStQimaV62ugX7G8rerZHzCLlZN872gBxmTATldqkCT6qQpHP11jL0M9LyZ0ZQALAEsAF2EAkBiEySJUxLl0GFwoAFsNXJwCnSIAB1jVRGTK6rL0OsQwptNGqsRLEFbbbo7eCv6XdvqPEbhvQer/KYndJqQWjqRIvumuhd6FhzWJ4d2kMZBcABMNU4bjnDOwi9WLrovei52L/Yuj08n0L+Sv3S+t2uKyIiiwUFUGCSoPBkPS6DBEKh2RAiLhbVRsORXTwOAgEBUGlx+MJumJBOUKPJhNW1MpOLxFJsRDpA3QrP2lBw6mSXPUuj5KMFq0FXUFvUFO0FnNw3IQRz532IOG5M2kKqCzFVYUVq0SUAgGn1ht0xpRZr1JUNXTNvVkyVkwQgQhRslWsi6sjtzuEO1k+1kRwkSuDDp9SCdQkW8nD7vDnvD3qjfvDAfDQZ9pB8jQEWHKEGhObzBcu5Vz+eELXLJdWABkALT2ogNwXJBtmtv11qd1q6BsXNsAcUbPu7zeHTYAukA")),oe=JSON.parse(R("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")),he=JSON.parse(R("NoJgrANCDsC6Q===")),le=()=>0,ce=R("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=");class L{constructor(e){this.item=e,this.children=[]}add(e){this.children.push(new L(e))}nodes(){return this.children.map(e=>e.nodes()).flat().concat([this])}shapes(){return this.nodes().filter(e=>!e.item.isContainer).map(e=>e.item)}leafCount(){return this.children.length==0?1:this.children.reduce((e,i)=>e+i.leafCount(),0)}randomize(e){this.item.randomize(e),this.children.forEach(i=>i.randomize(e))}render(e){this.item.render(e),this.children.forEach(i=>i.render(e))}layout(e=0,i=0,a=-10){if(this.item.x=e,this.item.y=i,this.item.z=a,!this.item.isContainer)return;const t=(l,h,d,y)=>h?o[l](d,y):o[l=
Welcome to "Kinoko Dreams," a collection of Japanese artworks inspired by my adventures in the magical world of mushroom picking in Japan. Imagine spending weekends in the autumn, not at home, but in the forests around Tokyo with my dad's work buddies. It seemed a bit strange at first – choosing colleagues over family during free time. But in Japan, work is more than just a job; it's like a second family, a big part of social life. Our journeys took us to places like Chichibu-Tama-Kai National Park and the Okutama region, where diverse flora, including lots of mushrooms, awaited. Together, we collected these little treasures as a way to bond, relax, and shake off stress. While picking mushrooms, my friends shared captivating stories about Japanese myths tied to these fungi. One story stood out – the Matsutake myth. It's a pine mushroom symbolizing good fortune and happiness, especially during the beautiful autumn harvest season. We also discovered other awesome mushrooms like Shiitake, Maitake, and Enoki. Each had its own story and importance, even in Japanese cooking. Recipes were shared, making our mushroom adventures not just about picking but also about creating delicious meals together. All these incredible memories sparked the idea to turn my experiences into art. "Kinoko Dreams" is a way to share the joy, stories, and magic of mushrooms with you. These artworks, filled with love and nostalgia, will be released during NFT Paris with Bright Moments, inviting you to join the whimsical journey of "Kinoko Dreams."
le travail des rêves The world is large, but in us it is deep as the sea. - Rainer Maria Rilke Depicting dreams has long been a practice that borders on something almost absurd. They are intricate, abstract, fragmented and mostly fleeting visuals manifested only in one person, and when shared with others they seem to take a step toward a more grounded existence. Perhaps this grounding of the ephemeral emphasises the intimacy of sharing dreams and, of course, makes them somewhat more real. In le travail des rêves, aurèce vettier does exactly this. He invites the viewer to participate in his personal dreamscape, encouraging us to submerge ourselves in his memories, from childhood until current times. Though with an indication in the prompt used for its creation and in the title of each piece, the viewer is still left with space for interpretation. Furthermore, with the low resolution of the pieces, the viewer is forced to search their own memories and dreamscape and, perhaps, also reflect upon what dreams might symbolise. In The Poetics of Space, Bachelard suggests that “[...] works of art are the by-products of this existentialism of the imagining being.”(1) This quote seems relevant in the case of this series, as the depiction seems to allude to questions about the connection between life and dreams. Though by-products might have a negative connotation, it is in the case of le travail des rêves, meant with all well-meaning. The art created in this somewhat existentialist quest is poetic visuals that reflect on joyous as well as troubled and dark memories, and perhaps also what it means to be human. This idea, of art as a by-product produced by ”existentialism of the imagining being”(2) is also relevant when reflecting on the use of AI in the creation process. aurèce vettier’s use of it might seem like a simple approach to translating dreams into something materialistic. Still, the process behind it is much more intimate than what might first be considered. His work is based upon full control of it, built on not being reliant on the technology, but rather being able to steer it in whatever way he might wish. The technology works for him, and by sharing intimate memories and dreams with a custom text-to-image algorithm that he has trained, the project is fully personal - from start to finish. And as a result, aurèce vettier invites the viewer into a dreamscape that only he can create. The sheer level of intimacy in this project and aurèce vettier unselfish sharing of the private sphere of his dreams creates a poetic result that, paradoxically, echoes the viewers' dreamscape and memories, blurring the lines of what belongs to him and what belongs to the viewer. Stina Gustafsson February 2024 **** (1) Gaston Bachelard, The Poetics of Space (Boston, Beacon Press, 2013) p. 18 (2) Ibid.
‘Flore Perdue’ is the second chapter of ‘Once Upon A Garden’, a project I started in 2022 which depicts a world where humans have to live with simulated images of plants and flowers because they have disappeared from earth. The project asks whether the preservation of nature is compatible with the goals of industrialised and industrialising societies, and in general is a reflection on what gets left behind in our pursuit of progress.
let BASE_URL=tokenData.preferredIPFSGateway,CID=tokenData.externalAssetDependencies[0].cid,TOTAL_IMAGES=400;const SEED=75849,fileType=".jpg";function mulberry32(e){let t=e;return function(){t|=0;let e=Math.imul((t=t+1831565813|0)^t>>>15,1|t);return(((e^=e+Math.imul(e^e>>>7,61|e))^e>>>14)>>>0)/4294967296}}function fisherYatesShuffle(e,t){let r=t.length,n,l,a=mulberry32(e);for(;0!==r;)l=Math.floor(a()*r),r-=1,n=t[r],t[r]=t[l],t[l]=n;return t}function generateIndices(e,t){let r=Array.from({length:t},(e,t)=>t);return fisherYatesShuffle(e,r)}function selectImage(e,t){let r=generateIndices(75849,t),n=r[e%t];return n}let tokenId=tokenData.tokenId;const selectedImage=selectImage(tokenId,TOTAL_IMAGES);class Random{constructor(){this.useA=!1;let e=function(e){let t=parseInt(e.substring(0,8),16),r=parseInt(e.substring(8,16),16),n=parseInt(e.substring(16,24),16),l=parseInt(e.substring(24,32),16);return function(){n|=0;let e=((t|=0)+(r|=0)|0)+(l|=0)|0;return l=l+1|0,t=r^r>>>9,r=n+(n<<3)|0,n=(n=n<<21|n>>>11)+e|0,(e>>>0)/4294967296}};this.prngA=new e(tokenData.hash.substring(2,34)),this.prngB=new e(tokenData.hash.substring(34,66));for(let t=0;t<1e6;t+=2)this.prngA(),this.prngB()}random_dec(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}random_num(e,t){return e+(t-e)*this.random_dec()}random_int(e,t){return Math.floor(this.random_num(e,t+1))}random_bool(e){return this.random_dec()<e}random_choice(e){return e[this.random_int(0,e.length-1)]}}let currentImage,imgScaleFactor,currentCircleColor,circleStates=[],globalColors=["#ff0000","#bdab7d","#A5DFB1","#b8e0e5","#C29FFF","#ff85cb","#0075A2","#FFC953"],R=new Random;function preload(){src=`${BASE_URL}/${CID}/${selectedImage}.jpg`}function createLoadingSVG(){let e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"svg");t.setAttributeNS(null,"viewBox","0 0 122.14 122.14"),t.setAttributeNS(null,"id","Layer_1"),t.setAttributeNS(null,"data-name","Layer 1");let r=document.createElementNS(e,"path");return r.setAttributeNS(null,"d","m0,122.14c67.46,0,122.14-54.69,122.14-122.14C54.69,0,0,54.69,0,122.14Zm86.37-35.78h-50.59v-50.59s50.59,0,50.59,0v50.59Z"),r.setAttributeNS(null,"style","fill: #231f20; stroke-width: 0px;"),t.appendChild(r),t.style.position="absolute",t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%) scale(0.5)",t.style.transformOrigin="center center",document.body.appendChild(t),t}function removeLoadingSVG(e){e&&e.parentNode&&e.parentNode.removeChild(e)}let img=new Image;img.onload=function(){removeLoadingSVG(loadingSVG),resizeAndDrawImage()};let loadingSVG=createLoadingSVG();function setup(){createCanvas(windowWidth,windowHeight),loadImageRandom()}function loadImageRandom(){console.log(src),currentImage=loadImage(src,e=>{currentImage=e,background(0);let t;imgScaleFactor=Math.min(windowWidth/currentImage.width,windowHeight/currentImage.height);let r=(windowWidth-currentImage.width*imgScaleFactor)/2,n=(windowHeight-currentImage.height*imgScaleFactor)/2;if(image(currentImage,r,n,currentImage.width*imgScaleFactor,currentImage.height*imgScaleFactor),currentCircleColor||(currentCircleColor=R.random_choice(globalColors)),0===circleStates.length){let l=currentImage.width/4,a=currentImage.height/5;for(let i=0;i<4;i++)for(let o=0;o<5;o++){let c=R.random_dec()>.2;circleStates.push({x:i*l+l/2,y:o*a+a/2,display:c})}}drawOverlayPattern(r,n,imgScaleFactor)})}function drawOverlayPattern(e,t,r){let n=300*r;noStroke(),fill(currentCircleColor),circleStates.forEach(l=>{if(l.display){let a;ellipse(e+l.x*r,t+l.y*r,n,n)}})}function windowResized(){resizeCanvas(windowWidth,windowHeight),loadImageRandom()}
let BASE_URL=tokenData.preferredIPFSGateway,CID=tokenData.externalAssetDependencies[0].cid,TOTAL_IMAGES=100;const SEED=152;function mulberry32(e){let t=e;return function(){t|=0,t=t+1831565813|0;let e=Math.imul(t^t>>>15,1|t);return e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296}}function fisherYatesShuffle(e,t){let n,a,r=t.length;const i=mulberry32(e);for(;0!==r;)a=Math.floor(i()*r),r-=1,n=t[r],t[r]=t[a],t[a]=n;return t}function generateIndices(e,t){return fisherYatesShuffle(e,Array.from({length:t},((e,t)=>t)))}function selectImage(e,t){return generateIndices(152,t)[e%t]}let tokenId=tokenData.tokenId;const selectedImage=selectImage(tokenId,TOTAL_IMAGES);function createLoadingSVG(){const e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"svg");t.setAttributeNS(null,"viewBox","0 0 122.14 122.14"),t.setAttributeNS(null,"id","Layer_1"),t.setAttributeNS(null,"data-name","Layer 1");const n=document.createElementNS(e,"path");return n.setAttributeNS(null,"d","m0,122.14c67.46,0,122.14-54.69,122.14-122.14C54.69,0,0,54.69,0,122.14Zm86.37-35.78h-50.59v-50.59s50.59,0,50.59,0v50.59Z"),n.setAttributeNS(null,"style","fill: #231f20; stroke-width: 0px;"),t.appendChild(n),t.style.position="absolute",t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%) scale(0.5)",t.style.transformOrigin="center center",document.body.appendChild(t),t}function removeLoadingSVG(e){e&&e.parentNode&&e.parentNode.removeChild(e)}const canvas=document.createElement("canvas");document.body.appendChild(canvas);const ctx=canvas.getContext("2d");let img=new Image;img.onload=function(){removeLoadingSVG(loadingSVG),resizeAndDrawImage()};let loadingSVG=createLoadingSVG();function resizeAndDrawImage(){canvas.width=window.innerWidth,canvas.height=window.innerHeight;let e=img.width/img.height,t=canvas.width,n=t/e;n>canvas.height&&(n=canvas.height,t=n*e);let a=(canvas.width-t)/2,r=(canvas.height-n)/2;ctx.drawImage(img,a,r,t,n)}img.src=`${BASE_URL}/${CID}/${selectedImage}.jpg`,console.log(img.src),window.addEventListener("resize",resizeAndDrawImage);
Aura is a collection of 100 high resolution AI-generated portraits, exploring the boundaries of realism versus imagination... how far a portrait image can be deconstructed so that a sense of humanity and emotion would still remain? Aura plays with our appreciation of realistic details in photography.
let BASE_URL=tokenData.preferredIPFSGateway,CID=tokenData.externalAssetDependencies[0].cid,TOTAL_IMAGES=100;const SEED=5158,fileType=".jpg";function mulberry32(e){let t=e;return function(){t|=0,t=t+1831565813|0;let e=Math.imul(t^t>>>15,1|t);return e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296}}function fisherYatesShuffle(e,t){let n,a,i=t.length;const r=mulberry32(e);for(;0!==i;)a=Math.floor(r()*i),i-=1,n=t[i],t[i]=t[a],t[a]=n;return t}function generateIndices(e,t){return fisherYatesShuffle(e,Array.from({length:t},((e,t)=>t)))}function selectImage(e,t){return generateIndices(SEED,t)[e%t]}let tokenId=tokenData.tokenId;const selectedImage=selectImage(tokenId,TOTAL_IMAGES);function createLoadingSVG(){const e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"svg");t.setAttributeNS(null,"viewBox","0 0 122.14 122.14"),t.setAttributeNS(null,"id","Layer_1"),t.setAttributeNS(null,"data-name","Layer 1");const n=document.createElementNS(e,"path");return n.setAttributeNS(null,"d","m0,122.14c67.46,0,122.14-54.69,122.14-122.14C54.69,0,0,54.69,0,122.14Zm86.37-35.78h-50.59v-50.59s50.59,0,50.59,0v50.59Z"),n.setAttributeNS(null,"style","fill: #231f20; stroke-width: 0px;"),t.appendChild(n),t.style.position="absolute",t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%) scale(0.5)",t.style.transformOrigin="center center",document.body.appendChild(t),t}function removeLoadingSVG(e){e&&e.parentNode&&e.parentNode.removeChild(e)}const canvas=document.createElement("canvas");document.body.appendChild(canvas);const ctx=canvas.getContext("2d");let img=new Image;img.onload=function(){removeLoadingSVG(loadingSVG),resizeAndDrawImage()};let loadingSVG=createLoadingSVG();function resizeAndDrawImage(){canvas.width=window.innerWidth,canvas.height=window.innerHeight;let e=img.width/img.height,t=canvas.width,n=t/e;n>canvas.height&&(n=canvas.height,t=n*e);let a=(canvas.width-t)/2,i=(canvas.height-n)/2;ctx.drawImage(img,a,i,t,n)}img.src=`${BASE_URL}/${CID}/${selectedImage}.jpg`,console.log(img.src),window.addEventListener("resize",resizeAndDrawImage);
Seeing Voices is a new series of AI images generated by the performance Voice In My Head (https://lauren-mccarthy.com/voice-in-my-head), a collaboration with Kyle McDonald. In that performance, participants place a bud in their ear and are guided by an AI-augmented voice in their head that listens in and offers commentary. The Seeing Voices images are generated based on phrases spoken in live sessions of Voice In My Head. Each text phrase is rendered visual with a drawing, where the artist performs the role of machine interpreter.
let BASE_URL=tokenData.preferredIPFSGateway,CID=tokenData.externalAssetDependencies[0].cid,TOTAL_IMAGES=100;const SEED=8276,fileType=".png";function mulberry32(e){let t=e;return function(){t|=0,t=t+1831565813|0;let e=Math.imul(t^t>>>15,1|t);return e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296}}function fisherYatesShuffle(e,t){let n,a,i=t.length;const r=mulberry32(e);for(;0!==i;)a=Math.floor(r()*i),i-=1,n=t[i],t[i]=t[a],t[a]=n;return t}function generateIndices(e,t){return fisherYatesShuffle(e,Array.from({length:t},((e,t)=>t)))}function selectImage(e,t){return generateIndices(SEED,t)[e%t]}let tokenId=tokenData.tokenId;const selectedImage=selectImage(tokenId,TOTAL_IMAGES);function createLoadingSVG(){const e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"svg");t.setAttributeNS(null,"viewBox","0 0 122.14 122.14"),t.setAttributeNS(null,"id","Layer_1"),t.setAttributeNS(null,"data-name","Layer 1");const n=document.createElementNS(e,"path");return n.setAttributeNS(null,"d","m0,122.14c67.46,0,122.14-54.69,122.14-122.14C54.69,0,0,54.69,0,122.14Zm86.37-35.78h-50.59v-50.59s50.59,0,50.59,0v50.59Z"),n.setAttributeNS(null,"style","fill: #231f20; stroke-width: 0px;"),t.appendChild(n),t.style.position="absolute",t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%) scale(0.5)",t.style.transformOrigin="center center",document.body.appendChild(t),t}function removeLoadingSVG(e){e&&e.parentNode&&e.parentNode.removeChild(e)}const canvas=document.createElement("canvas");document.body.appendChild(canvas);const ctx=canvas.getContext("2d");let img=new Image;img.onload=function(){removeLoadingSVG(loadingSVG),resizeAndDrawImage()};let loadingSVG=createLoadingSVG();function resizeAndDrawImage(){canvas.width=window.innerWidth,canvas.height=window.innerHeight;let e=img.width/img.height,t=canvas.width,n=t/e;n>canvas.height&&(n=canvas.height,t=n*e);let a=(canvas.width-t)/2,i=(canvas.height-n)/2;ctx.drawImage(img,a,i,t,n)}img.src=`${BASE_URL}/${CID}/${selectedImage}.png`,console.log(img.src),window.addEventListener("resize",resizeAndDrawImage);
Drawing on parallels between the 1920s avant-garde and 2020s generative art, my collection aims to create composite portraits of characters that never existed, blending Dadaism, binary code, and a grid system inspired by the Paris arrondissements, into a retro-futuristic extravaganza that transcends time and digital boundaries.
let BASE_URL=tokenData.preferredIPFSGateway,CID=tokenData.externalAssetDependencies[0].cid,TOTAL_IMAGES=100;const SEED=3725,fileType=".jpg";function mulberry32(e){let t=e;return function(){t|=0,t=t+1831565813|0;let e=Math.imul(t^t>>>15,1|t);return e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296}}function fisherYatesShuffle(e,t){let n,a,i=t.length;const r=mulberry32(e);for(;0!==i;)a=Math.floor(r()*i),i-=1,n=t[i],t[i]=t[a],t[a]=n;return t}function generateIndices(e,t){return fisherYatesShuffle(e,Array.from({length:t},((e,t)=>t)))}function selectImage(e,t){return generateIndices(SEED,t)[e%t]}let tokenId=tokenData.tokenId;const selectedImage=selectImage(tokenId,TOTAL_IMAGES);function createLoadingSVG(){const e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"svg");t.setAttributeNS(null,"viewBox","0 0 122.14 122.14"),t.setAttributeNS(null,"id","Layer_1"),t.setAttributeNS(null,"data-name","Layer 1");const n=document.createElementNS(e,"path");return n.setAttributeNS(null,"d","m0,122.14c67.46,0,122.14-54.69,122.14-122.14C54.69,0,0,54.69,0,122.14Zm86.37-35.78h-50.59v-50.59s50.59,0,50.59,0v50.59Z"),n.setAttributeNS(null,"style","fill: #231f20; stroke-width: 0px;"),t.appendChild(n),t.style.position="absolute",t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%) scale(0.5)",t.style.transformOrigin="center center",document.body.appendChild(t),t}function removeLoadingSVG(e){e&&e.parentNode&&e.parentNode.removeChild(e)}const canvas=document.createElement("canvas");document.body.appendChild(canvas);const ctx=canvas.getContext("2d");let img=new Image;img.onload=function(){removeLoadingSVG(loadingSVG),resizeAndDrawImage()};let loadingSVG=createLoadingSVG();function resizeAndDrawImage(){canvas.width=window.innerWidth,canvas.height=window.innerHeight;let e=img.width/img.height,t=canvas.width,n=t/e;n>canvas.height&&(n=canvas.height,t=n*e);let a=(canvas.width-t)/2,i=(canvas.height-n)/2;ctx.drawImage(img,a,i,t,n)}img.src=`${BASE_URL}/${CID}/${selectedImage}.jpg`,console.log(img.src),window.addEventListener("resize",resizeAndDrawImage);
let BASE_URL=tokenData.preferredIPFSGateway,CID=tokenData.externalAssetDependencies[0].cid,TOTAL_IMAGES=100;const SEED=8139;function mulberry32(e){let t=e;return function(){t|=0,t=t+1831565813|0;let e=Math.imul(t^t>>>15,1|t);return e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296}}function fisherYatesShuffle(e,t){let n,a,r=t.length;const i=mulberry32(e);for(;0!==r;)a=Math.floor(i()*r),r-=1,n=t[r],t[r]=t[a],t[a]=n;return t}function generateIndices(e,t){return fisherYatesShuffle(e,Array.from({length:t},((e,t)=>t)))}function selectImage(e,t){return generateIndices(SEED,t)[e%t]}let tokenId=tokenData.tokenId;const selectedImage=selectImage(tokenId,TOTAL_IMAGES);function createLoadingSVG(){const e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"svg");t.setAttributeNS(null,"viewBox","0 0 122.14 122.14"),t.setAttributeNS(null,"id","Layer_1"),t.setAttributeNS(null,"data-name","Layer 1");const n=document.createElementNS(e,"path");return n.setAttributeNS(null,"d","m0,122.14c67.46,0,122.14-54.69,122.14-122.14C54.69,0,0,54.69,0,122.14Zm86.37-35.78h-50.59v-50.59s50.59,0,50.59,0v50.59Z"),n.setAttributeNS(null,"style","fill: #231f20; stroke-width: 0px;"),t.appendChild(n),t.style.position="absolute",t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%) scale(0.5)",t.style.transformOrigin="center center",document.body.appendChild(t),t}function removeLoadingSVG(e){e&&e.parentNode&&e.parentNode.removeChild(e)}const canvas=document.createElement("canvas");document.body.appendChild(canvas);const ctx=canvas.getContext("2d");let img=new Image;img.onload=function(){removeLoadingSVG(loadingSVG),resizeAndDrawImage()};let loadingSVG=createLoadingSVG();function resizeAndDrawImage(){canvas.width=window.innerWidth,canvas.height=window.innerHeight;let e=img.width/img.height,t=canvas.width,n=t/e;n>canvas.height&&(n=canvas.height,t=n*e);let a=(canvas.width-t)/2,r=(canvas.height-n)/2;ctx.drawImage(img,a,r,t,n)}img.src=`${BASE_URL}/${CID}/${selectedImage}.jpg`,console.log(img.src),window.addEventListener("resize",resizeAndDrawImage);
In 'Dolor Gravitacional' I explore the profound analogy between the universe's gravitational forces—both creative and destructive—and the intense attractions in human relationships. These forces, powerful enough to warp planets and alter our very identities, reflect the delicate balance of creation, destruction, and the emotional contortions we undergo to fit into the world's reality. Through sweeping lines and bending forms in 'Dolor Gravitacional,' the oscillating patterns echo the internal human struggles, akin to celestial bodies responding to gravitational pulls. As viewers, we're drawn into a contemplative journey, recognizing the deep interplay between cosmic dynamics and our personal existential challenges, all within a universe marked by both chaos and serenity.
// Sofia Crespo - 2023 - 'Time after vessels' const ganResolution=512,tileSize=64,gridSize=32,hashPairs=[];for(let t=0;t<32;t++)hashPairs.push(tokenData.hash.slice(2+2*t,4+2*t));const dcP=hashPairs.map((t=>parseInt(t,16))),inputPointsSeeds=[];for(let t=27;t<32;t++)inputPointsSeeds.push(parseInt(hashPairs[t],16));const createCanvas=document.createElement("canvas"),default_size=1024;createCanvas.id="canvas",createCanvas.width=1024,createCanvas.height=1024;let body=document.getElementsByTagName("body")[0];body.appendChild(createCanvas);const canvasStyles="\n padding-left: 0;\n padding-right: 0;\n margin-left: auto;\n margin-right: auto;\n display: block;\n width: auto;\n height: 100vh;\n",element=document.querySelector("#canvas");element.style.cssText=canvasStyles;const canvas=document.getElementById("canvas");(async()=>{console.log("Dependencies loading...");let t="QmT1M2gyGfXuwYsRosdQaVFV3P9VoD4CdmtBbiPzGUDXFH";async function e(t,e,n,a,o){const s=document.createElement("canvas"),i=s.getContext("2d");s.width=e,s.height=n,i.putImageData(new ImageData(t,e,n),0,0);const r=document.createElement("canvas");r.width=a,r.height=o;const c=r.getContext("2d");c.drawImage(s,0,0,e,n,0,0,a,o);return c.getImageData(0,0,a,o).data}function n(t){const e=Math.sqrt(t.reduce(((t,e)=>t+e*e),0));return t.map((t=>t/e))}function a(t,e){return t.map(((t,n)=>t+e[n]))}function o(t,e){return t.map((t=>t*e))}function s(t,e){const n=Math.floor(16),a=Math.floor(16),o=new Uint8ClampedArray(1048576);for(let s=0;s<a;s++)for(let i=0;i<n;i++){const r=32*i,c=32*s;let l=[0,0,0];for(let e=0;e<64;e++)for(let n=0;n<64;n++){const a=4*(512*(c+e)+(r+n));l[0]+=t[a],l[1]+=t[a+1],l[2]+=t[a+2]}l=l.map((t=>t/4096));let m=1/0,h=0,d=0;for(let t=0;t<a;t++)for(let a=0;a<n;a++){const n=64*a,o=64*t;let s=0;for(let t=0;t<64;t++)for(let a=0;a<64;a++){const i=4*(512*(o+t)+(n+a));s+=Math.abs(e[i]-l[0]),s+=Math.abs(e[i+1]-l[1]),s+=Math.abs(e[i+2]-l[2])}s<m&&(m=s,h=n,d=o)}const u=2;for(let t=0;t<32;t++)for(let n=0;n<32;n++){const a=4*(512*(c+t)+(r+n)),s=4*(Math.floor(512*(d+t*u))+Math.floor(h+n*u));o[a]=e[s],o[a+1]=e[s+1],o[a+2]=e[s+2],o[a+3]=255}}return o}async function i(t,i,r,c,l,m,h,d,u,f,g,p){const w=function(t,e,s){const i=n(e),r=n(s),c=Math.acos((l=r,i.reduce(((t,e,n)=>t+e*l[n]),0)));var l;const m=Math.sin(c);return a(o(e,Math.sin((1-t)*c)/m),o(s,Math.sin(t*c)/m))}(i/r,c,l),v=new ort.Tensor("float32",Float32Array.from(w),[1,256]),y=(await m.run({[h]:v}))[d].data,M=new Uint8ClampedArray(1048576);for(let t=0;t<3;t++)for(let e=0;e<512;e++)for(let n=0;n<512;n++){const a=512*t*512+512*e+n;M[4*(512*e+n)+t]=Math.min(255,Math.max(0,255*y[a]))}for(let t=3;t<M.length;t+=4)M[t]=255;const P=p?s(M,p):M,b=await e(P,512,512,1024,1024),I=new ImageData(b,1024,1024);return u.putImageData(I,0,0),f.push(new Promise((t=>{canvas.toBlob((e=>{t(e)}))}))),M}function r(t){return new Promise((e=>setTimeout(e,t)))}await import(`https://pinata.brightmoments.io/ipfs/${t}/seedrandom.min.js`),await import(`https://pinata.brightmoments.io/ipfs/${t}/ort.min.js`),ort.env.wasm.wasmPaths=`https://pinata.brightmoments.io/ipfs/${t}/`,console.log("Dependencies loaded."),async function(){const n=canvas.getContext("2d");console.log("Model loading...");const a=await ort.InferenceSession.create(`https://pinata.brightmoments.io/ipfs/${t}/sc-model.onnx`),o=a.inputNames[0],c=a.outputNames[0];console.log("Model loaded. Running inference...");const l=240,m=inputPointsSeeds.map((t=>function(t){const e=new Math.seedrandom(t);return Array.from({length:256},(()=>2*e()-1))}(t)));m.push(m[0]);const h=l/inputPointsSeeds.length,d=Math.round(h),u=[],f=inputPointsSeeds.length;let g=null,p=null;function w(t){const e=t/l*100;e%10==0&&console.log(`${e}% complete`)}for(let t=0;t<f;t++){const e=m[t],s=m[t+1];for(let l=0;l<d;l++){w(t*d+l),g=await i(0,l,d,e,s,a,o,c,n,u,0,g),0===t&&0===l&&(p=g),await r(10)}}console.log("inference complete!");const v=s(p,g),y=await e(v,512,512,1024,1024),M=new ImageData(y,1024,1024);n.putImageData(M,0,0);const P=await new Promise((t=>{canvas.toBlob((e=>{t(e)}))}));u.unshift(P),u.splice(1,1);const b=await Promise.all(u),I=t=>{const e=new Image;e.src=URL.createObjectURL(t),e.onload=()=>{n.drawImage(e,0,0,canvas.width,canvas.height)}},C=async()=>{for(let t=0;t<b.length;t++)I(b[t]),await new Promise((t=>setTimeout(t,41.666666666666664)));C()};C()}()})();
function fisherYatesShuffle(seed,array){let currentIndex=array.length;let temporaryValue,randomIndex;while(currentIndex!==0){randomIndex=(seed+currentIndex)%currentIndex;currentIndex-=1;temporaryValue=array[currentIndex];array[currentIndex]=array[randomIndex];array[randomIndex]=temporaryValue} return array} function generateIndices(seed,totalImages){const array=Array.from({length:totalImages},(_,i)=>i+1);return fisherYatesShuffle(seed,array)} function selectImage(tokenId,totalImages=100){const seed=648137;const indices=generateIndices(seed,totalImages);console.log(`tokenId: ${tokenId}`) console.log(`Selection: ${indices[tokenId % totalImages]}`) return indices[tokenId%totalImages]} const selectedImage=selectImage(tokenData.tokenId);let img;function preload(){img=loadImage(`https://pinata.brightmoments.io/ipfs/QmXbRMfkCXcD5Zj1S1qb4UYy66x76471kibabjcaTkP7j3/${selectedImage}.jpg`)} function setup(){createCanvas(windowWidth,windowHeight)} function draw(){background(0);let imgAspectRatio=img.width/img.height;let newWidth=width;let newHeight=newWidth/imgAspectRatio;if(newHeight>height){newHeight=height;newWidth=newHeight*imgAspectRatio} let x=(width-newWidth)/2;let y=(height-newHeight)/2;image(img,x,y,newWidth,newHeight)} function windowResized(){resizeCanvas(windowWidth,windowHeight)}
function fisherYatesShuffle(seed, array) { let currentIndex = array.length; let temporaryValue, randomIndex; while (currentIndex !== 0) { randomIndex = (seed + currentIndex) % currentIndex; currentIndex -= 1; temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; } function generateIndices(seed, totalImages) { const array = Array.from({ length: totalImages }, (_, i) => i + 1); return fisherYatesShuffle(seed, array); } function selectImage(tokenId, totalImages = 100) { const seed = 824716; const indices = generateIndices(seed, totalImages); console.log(`tokenId: ${tokenId}`) console.log(`Selection: ${indices[tokenId % totalImages]}`) return indices[tokenId % totalImages]; } const selectedImage = selectImage(tokenData.tokenId); let CID = "QmPAH58UXYahSoZDdgLFGYWNnnfLTLWF5ThRXn54dTRt9F" function initVideoPlayer() { const videoElement = document.createElement('video'); videoElement.setAttribute('preload', 'auto'); videoElement.style.display = 'none'; videoElement.style.position = 'absolute'; videoElement.style.top = '50%'; videoElement.style.left = '50%'; videoElement.style.transform = 'translate(-50%, -50%)'; videoElement.style.objectFit = 'contain'; videoElement.style.maxWidth = '100vw'; videoElement.style.maxHeight = '100vh'; function loadVideo() { const videoURL = `https://brightmoments.mypinata.cloud/ipfs/${CID}/${selectedImage}.mp4`; videoElement.src = videoURL; } videoElement.oncanplaythrough = function() { videoElement.style.display = 'block'; }; loadVideo(); document.body.appendChild(videoElement); document.onclick = function() { videoElement.setAttribute('loop', ''); videoElement.play(); document.onclick = null; }; } document.addEventListener('DOMContentLoaded', initVideoPlayer);
function fisherYatesShuffle(seed, array) { let currentIndex = array.length; let temporaryValue, randomIndex; while (currentIndex !== 0) { randomIndex = (seed + currentIndex) % currentIndex; currentIndex -= 1; temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; } function generateIndices(seed, totalImages) { const array = Array.from({ length: totalImages }, (_, i) => i); return fisherYatesShuffle(seed, array); } function selectImage(tokenId, totalImages = 100) { const seed = 582036; const indices = generateIndices(seed, totalImages); console.log(`tokenId: ${tokenId}`) console.log(`Selection: ${indices[tokenId % totalImages]}`) return indices[tokenId % totalImages]; } const selectedImage = selectImage(tokenData.tokenId); let CID = "QmaPUSHdSYYQonhEZsZYdQUbKBpMsTAtRcNfQdJstskjed" function initVideoPlayer() { const videoElement = document.createElement('video'); videoElement.setAttribute('preload', 'auto'); videoElement.style.display = 'none'; videoElement.style.position = 'absolute'; videoElement.style.top = '50%'; videoElement.style.left = '50%'; videoElement.style.transform = 'translate(-50%, -50%)'; videoElement.style.objectFit = 'contain'; videoElement.style.maxWidth = '100vw'; videoElement.style.maxHeight = '100vh'; function loadVideo() { const videoURL = `https://brightmoments.mypinata.cloud/ipfs/${CID}/${selectedImage}.mp4`; videoElement.src = videoURL; } videoElement.oncanplaythrough = function() { videoElement.style.display = 'block'; }; loadVideo(); document.body.appendChild(videoElement); document.onclick = function() { videoElement.setAttribute('loop', ''); videoElement.play(); document.onclick = null; }; } document.addEventListener('DOMContentLoaded', initVideoPlayer);
'Metabolic Metropolis' is a generative art collection that depicts 100 unique views of Tokyo through which A.A.Murakami’s signature fog rings flow across the cityscape. Utilizing open source data acquired based on aerial surveys, the data set represents the real urban landscape of Tokyo as a 3D Model in the game engine Unity. On this architectural base, custom outline shaders were developed that overlay a luminous grid of lights creating geometric patterns that glide and glitch on the surface of the city. These shaders draw inspiration from highly patterned woodblock prints of the ‘Floating World’ during the Edo period and the ‘Metabolism Architecture’ movement of 1960's Japan. A.A.Murakami's artistic practice in merging art, technology and nature continues in the digital realm. The ethereal quality conveyed in the iconic fog rings is transferred in the web3 space capturing the fleeting moment of nature and the transience of life which lies inside the 'Metabolic Metropolis'.
function fisherYatesShuffle(seed,array){let currentIndex=array.length;let temporaryValue,randomIndex;while(currentIndex!==0){randomIndex=(seed+currentIndex)%currentIndex;currentIndex-=1;temporaryValue=array[currentIndex];array[currentIndex]=array[randomIndex];array[randomIndex]=temporaryValue} return array} function generateIndices(seed,totalImages){const array=Array.from({length:totalImages},(_,i)=>i+1);return fisherYatesShuffle(seed,array)} function selectImage(tokenId,totalImages=100){const seed=317694;const indices=generateIndices(seed,totalImages);console.log(`tokenId: ${tokenId}`) console.log(`Selection: ${indices[tokenId % totalImages]}`) return indices[tokenId%totalImages]} const selectedImage=selectImage(tokenData.tokenId);let img;function preload(){img=loadImage(`https://pinata.brightmoments.io/ipfs/QmXQb4SMzPtgwaPiLYyTUseoBQ9ExfKCoNfEhAypcWD41k/${selectedImage}.png`)} function setup(){createCanvas(windowWidth,windowHeight)} function draw(){background(0);let imgAspectRatio=img.width/img.height;let newWidth=width;let newHeight=newWidth/imgAspectRatio;if(newHeight>height){newHeight=height;newWidth=newHeight*imgAspectRatio} let x=(width-newWidth)/2;let y=(height-newHeight)/2;image(img,x,y,newWidth,newHeight)} function windowResized(){resizeCanvas(windowWidth,windowHeight)}
Source introduces an advanced approach to image generation, underpinning the potential of integrating machine learning and blockchain technologies. This methodology merges the powerful functionalities of OpenCV and Diffusers to curate an aesthetic universe of science fiction-inspired generative structures, set against a stark, contrasting backdrop. The collection was created from a Stable Diffusion checkpoint fine-tuned on generative artworks and a custom 7-pass inference routine. The custom inference has the capacity for the real-time generation of high-definition 4K outputs at the moment of minting. The reproducibility of the entire collection signifies a noteworthy step in the democratization of generative artwork, ensuring accessibility and verifiability of the artistic process.
function fisherYatesShuffle(seed,array){let currentIndex=array.length;let temporaryValue,randomIndex;while(currentIndex!==0){randomIndex=(seed+currentIndex)%currentIndex;currentIndex-=1;temporaryValue=array[currentIndex];array[currentIndex]=array[randomIndex];array[randomIndex]=temporaryValue} return array} function generateIndices(seed,totalImages){const array=Array.from({length:totalImages},(_,i)=>i+1);return fisherYatesShuffle(seed,array)} function selectImage(tokenId,totalImages=100){const seed=295871;const indices=generateIndices(seed,totalImages);console.log(`tokenId: ${tokenId}`) console.log(`Selection: ${indices[tokenId % totalImages]}`) return indices[tokenId%totalImages]} const selectedImage=selectImage(tokenData.tokenId);let img;function preload(){img=loadImage(`https://pinata.brightmoments.io/ipfs/QmXfiSkeD7NHtyR46nmm53Uh4VmWVXMrayKiheTr3iLoDB/${selectedImage}.png`)} function setup(){createCanvas(windowWidth,windowHeight)} function draw(){background(0);let imgAspectRatio=img.width/img.height;let newWidth=width;let newHeight=newWidth/imgAspectRatio;if(newHeight>height){newHeight=height;newWidth=newHeight*imgAspectRatio} let x=(width-newWidth)/2;let y=(height-newHeight)/2;image(img,x,y,newWidth,newHeight)} function windowResized(){resizeCanvas(windowWidth,windowHeight)}
Neural Fad reimagines Tokyo street fashion history to examine the relationship between AI and memory. In post-war Japan, distinctive magazines and television cultivated an aspirational youth culture that gave rise to unique fashion subcultures at different train stations around Tokyo. Inspired by the rebellious spirit of each generation and their projections towards an imagined future, Kusano produces records of subcultures that never actually existed. Reimagining the rich vocabulary and history of Tokyo street fashion through AI, the collection takes the viewer across and beyond the post-war decades of Japanese fashion history — from the Moga and Mobo of the 1940s to the Japanese hippies known as the Fūten Tribe, the Karasu Tribe of the 90s and the Gyaru and Decora fashion of the late 90s and early 2000 — to present Tokyo street fashion as imagined beyond time. Through this collaboration between AI and Japanese street fashion archives that she herself contributed to as a street photographer of Harajuku fashion, Kusano uses emerging technologies to offer a retro-futuristic intervention into the landscape of Tokyo street fashion.
1-50 of 77