|
| 1 | +const fs = require("fs"); |
| 2 | +const myArgs = process.argv.slice(2); |
| 3 | +const { createCanvas, loadImage } = require("canvas"); |
| 4 | +const { layers, width, height } = require("./input/config.js"); |
| 5 | +const console = require("console"); |
| 6 | +const canvas = createCanvas(width, height); |
| 7 | +const ctx = canvas.getContext("2d"); |
| 8 | +const editionSize = myArgs.length > 0 ? Number(myArgs[0]) : 1; |
| 9 | +var metadataList = []; |
| 10 | +var attributesList = []; |
| 11 | +var dnaList = []; |
| 12 | + |
| 13 | +const saveImage = (_editionCount) => { |
| 14 | + fs.writeFileSync( |
| 15 | + `./output/${_editionCount}.png`, |
| 16 | + canvas.toBuffer("image/png") |
| 17 | + ); |
| 18 | +}; |
| 19 | + |
| 20 | +const signImage = (_sig) => { |
| 21 | + ctx.fillStyle = "#000000"; |
| 22 | + ctx.font = "bold 30pt Courier"; |
| 23 | + ctx.textBaseline = "top"; |
| 24 | + ctx.textAlign = "left"; |
| 25 | + ctx.fillText(_sig, 40, 40); |
| 26 | +}; |
| 27 | + |
| 28 | +const genColor = () => { |
| 29 | + let hue = Math.floor(Math.random() * 360); |
| 30 | + let pastel = `hsl(${hue}, 100%, 85%)`; |
| 31 | + return pastel; |
| 32 | +}; |
| 33 | + |
| 34 | +const drawBackground = () => { |
| 35 | + ctx.fillStyle = genColor(); |
| 36 | + ctx.fillRect(0, 0, width, height); |
| 37 | +}; |
| 38 | + |
| 39 | +const addMetadata = (_dna, _edition) => { |
| 40 | + let dateTime = Date.now(); |
| 41 | + let tempMetadata = { |
| 42 | + dna: _dna, |
| 43 | + edition: _edition, |
| 44 | + date: dateTime, |
| 45 | + attributes: attributesList, |
| 46 | + }; |
| 47 | + metadataList.push(tempMetadata); |
| 48 | + attributesList = []; |
| 49 | +}; |
| 50 | + |
| 51 | +const addAttributes = (_element) => { |
| 52 | + let selectedElement = _element.layer.selectedElement; |
| 53 | + attributesList.push({ |
| 54 | + name: selectedElement.name, |
| 55 | + rarity: selectedElement.rarity, |
| 56 | + }); |
| 57 | +}; |
| 58 | + |
| 59 | +const loadLayerImg = async (_layer) => { |
| 60 | + return new Promise(async (resolve) => { |
| 61 | + const image = await loadImage( |
| 62 | + `${_layer.location}${_layer.selectedElement.fileName}` |
| 63 | + ); |
| 64 | + resolve({ layer: _layer, loadedImage: image }); |
| 65 | + }); |
| 66 | +}; |
| 67 | + |
| 68 | +const drawElement = (_element) => { |
| 69 | + ctx.drawImage( |
| 70 | + _element.loadedImage, |
| 71 | + _element.layer.position.x, |
| 72 | + _element.layer.position.y, |
| 73 | + _element.layer.size.width, |
| 74 | + _element.layer.size.height |
| 75 | + ); |
| 76 | + addAttributes(_element); |
| 77 | +}; |
| 78 | + |
| 79 | +const constructLayerToDna = (_dna, _layers) => { |
| 80 | + let DnaSegment = _dna.toString().match(/.{1,2}/g); |
| 81 | + let mappedDnaToLayers = _layers.map((layer) => { |
| 82 | + let selectedElement = |
| 83 | + layer.elements[parseInt(DnaSegment) % layer.elements.length]; |
| 84 | + return { |
| 85 | + location: layer.location, |
| 86 | + position: layer.position, |
| 87 | + size: layer.size, |
| 88 | + selectedElement: selectedElement, |
| 89 | + }; |
| 90 | + }); |
| 91 | + return mappedDnaToLayers; |
| 92 | +}; |
| 93 | + |
| 94 | +const isDnaUnique = (_DnaList = [], _dna) => { |
| 95 | + let foundDna = _DnaList.find((i) => i === _dna); |
| 96 | + return foundDna == undefined ? true : false; |
| 97 | +}; |
| 98 | + |
| 99 | +const createDna = (_len) => { |
| 100 | + let randNum = Math.floor( |
| 101 | + Number(`1e${_len}`) + Math.random() * Number(`9e${_len}`) |
| 102 | + ); |
| 103 | + return randNum; |
| 104 | +}; |
| 105 | + |
| 106 | +const writeMetaData = (_data) => { |
| 107 | + fs.writeFileSync("./output/_metadata.json", _data); |
| 108 | +}; |
| 109 | + |
| 110 | +const startCreating = async () => { |
| 111 | + writeMetaData(""); |
| 112 | + let editionCount = 1; |
| 113 | + while (editionCount <= editionSize) { |
| 114 | + console.log(editionCount); |
| 115 | + |
| 116 | + let newDna = createDna(layers.length * 2 - 1); |
| 117 | + console.log(dnaList); |
| 118 | + if (isDnaUnique(dnaList, newDna)) { |
| 119 | + let results = constructLayerToDna(newDna, layers); |
| 120 | + let loadedElements = []; //promise array |
| 121 | + |
| 122 | + results.forEach((layer) => { |
| 123 | + loadedElements.push(loadLayerImg(layer)); |
| 124 | + }); |
| 125 | + |
| 126 | + await Promise.all(loadedElements).then((elementArray) => { |
| 127 | + drawBackground(); |
| 128 | + elementArray.forEach((element) => { |
| 129 | + drawElement(element); |
| 130 | + }); |
| 131 | + signImage(`#${editionCount}`); |
| 132 | + saveImage(editionCount); |
| 133 | + addMetadata(newDna, editionCount); |
| 134 | + console.log(`Created edition: ${editionCount} with DNA: ${newDna}`); |
| 135 | + }); |
| 136 | + dnaList.push(newDna); |
| 137 | + editionCount++; |
| 138 | + } else { |
| 139 | + console.log("DNA exists!"); |
| 140 | + } |
| 141 | + } |
| 142 | + writeMetaData(JSON.stringify(metadataList)); |
| 143 | +}; |
| 144 | + |
| 145 | +startCreating(); |
0 commit comments