0x18b75119…b783sent to0x381233d5…7acd·#19,667,759·view on Etherscan
[1 ,()=>{console.log("Artist 49. Shunsuke Takawo -- platform 1 ");let debugMode = false;
let exportMode = false;
const MAX_HEIGHT = 3840;
const MAX_WIDTH = 2160;
const EXPORT_HEIGHT = 3840 * 2;
const EXPORT_WIDTH = 2160 * 2;
let hash;
let hashPairs = [];
let decPairs = [];
let canvasScale;
let params, features;
let g, gg;
let shaderProgram;
let graphics, centerPosition, centerAngle, cam;
let palette;
let saveBoolean = false;
let vn = 0;
let cameraAngle;
let cameraDistancePercent;
/*
* setup p5.js
*/
setup = () => {
params = setupParams();
setupCanvas();
noLoop();
if (debugMode) {
let features = structuredClone(params);
print("================================================");
print("features");
print(features);
print("================================================");
return features;
}
}
function setupCanvas() {
const canvasSize = calculatePortraitAspectRatio(debugMode);
canvasScale = canvasSize.scale;
createCanvas(canvasSize.width, canvasSize.height, WEBGL);
pixelDensity(1);
colorMode(HSB, 360, 100, 100, 100);
cam = createCamera();
noSmooth();
}
function keyPressed() {
if (key == "s" || key == "S") {
debugMode = true;
exportMode = true;
setup();
redraw();
}
}
/*
* draw p5.js
*/
draw = () => {
orbitControl();
randomSeed(0);
let d = max(width, height);
g = createGraphics(d, d, P2D);
g.colorMode(HSB, 360, 100, 100, 100);
g.angleMode(DEGREES);
// g.noStroke();
let cx = cos(cameraAngle) * cameraDistancePercent * 2500 / 2 * canvasScale;
let cy = sin(cameraAngle) * cameraDistancePercent * 2500 / 2 * canvasScale;
let v = R.random_dec();
let distance = params.Distance;
let perspective;
switch (distance) {
case "Near":
perspective = PI / 2.2;
break;
case "Middle":
perspective = PI / 1.7;
break;
case "Far":
perspective = PI / 1.4;
break;
}
cam.setPosition(cx, cy, 0);
cam.lookAt(cx, cy, -15000 * canvasScale);
cam.perspective(
perspective,
width / height,
0.001,
15000 * canvasScale
);
g.blendMode(BLEND);
g.background(0);
let gw = g.width * sqrt(2);
let patternSizeMin;
let patternSizeMax;
switch (params.PatternSize) {
case "Small":
patternSizeMin = gw / 150;
patternSizeMax = gw / 100;
break;
case "Medium":
patternSizeMin = gw / 100;
patternSizeMax = gw / 75;
break;
case "Large":
patternSizeMin = gw / 75;
patternSizeMax = gw / 50;
break;
case "XLarge":
patternSizeMin = gw / 50;
patternSizeMax = gw / 25;
break;
}
let patternSize = R.random_dec() * (patternSizeMax - patternSizeMin) + patternSizeMin;
for (let i = 0; i < (params.MultipleDraw ? 1 : 2); i++) {
g.push();
g.translate(g.width / 2, g.height / 2);
if (params.RotatePattern) {
g.rotate(45);
}
g.translate(-gw / 2, -gw / 2);
separateGrid(0, 0, gw, patternSize, g)
g.pop();
}
directionalLight(color(255), 1, 0, 0);
directionalLight(color(255), -1, 0, 0);
directionalLight(color(255), 0, 0, -1);
ambientLight(color(50));
shearX(0);
shearY(0);
orbitControl();
push();
// scale(20);
rotateX(PI / 2);
// rotateY(0 + (PI / 3) * v + (vn * PI) / 3);
rotateY(params.ObjectAngle);
texture(g);
noStroke();
let polygonCorners_num;
switch (params.PolygonCorners) {
case "Triangle":
polygonCorners_num = 3;
break;
case "Square":
polygonCorners_num = 4;
break;
case "Pentagon":
polygonCorners_num = 5;
break;
case "Hexagon":
polygonCorners_num = 6;
break;
case "Heptagon":
polygonCorners_num = 7;
break;
case "Octagon":
polygonCorners_num = 8;
break;
}
cylinder(2500 / 2 * canvasScale, 5000 * canvasScale, polygonCorners_num + 1, 1, false, false);
pop();
push();
translate(0, 0, -2501 * canvasScale);
fill(0, 255);
texture(g);
rectMode(CENTER);
square(0, 0, (2500 / sqrt(2)) * sqrt(3) * canvasScale);
pop();
push();
translate(0, 0, 2501 * canvasScale);
rotateZ(TWO_PI / 3 + (TWO_PI / 3) * v + (vn * TWO_PI) / 3);
fill(0, 255);
texture(g);
rectMode(CENTER);
pop();
if (exportMode) {
save(hash + ".png");
}
g.remove();
}
function setupParams() {
hash = tokenData.hash;
if (debugMode) {
// hash = "0x622fb6114b74ada47abf7a4721f697623f8c33c89adbe098367416c808cd8447";
print("================================================");
print("debugMode", debugMode);
print("hash", hash);
print("================================================");
}
// noiseSeed(R.random_dec() * 1000000);
for (let j = 0; j < 32; j++) {
hashPairs.push(hash.slice(2 + j * 2, 4 + j * 2));
}
decPairs = hashPairs.map((x) => {
return parseInt(x, 16);
});
let params = getParams(decPairs);
if (!debugMode) {
print(params);
print("================================================");
print("Colors : ", params.Colors);
print("PolygonCorners : ", params.PolygonCorners);
print("PatternSize : ", params.PatternSize);
print("Distance : ", params.Distance);
print("MultipleDraw : ", params.MultipleDraw);
print("RotatePattern : ", params.RotatePattern);
print("ObjectAngle : ", params.ObjectAngle);
print("================================================");
}
return params;
}
function getParams(decPairs) {
const colorOjbect = colorScheme[decPairs[1] % colorScheme.length];
palette = colorOjbect.colors;
let polygonCornersNum = decPairs[2] % 6 + 3;
let polygonCorners;
let multipleDraw = decPairs[3] % 6 > 4;
let distanceNum = decPairs[5] % 7;
let distance;
let objectAngle = decPairs[10] % 10 > 5 ? 0 : (decPairs[11] % 360);
switch (distanceNum) {
case 0:
distance = "Near";
break;
case 1:
case 2:
case 3:
distance = "Middle";
break;
case 4:
case 5:
case 6:
distance = "Far";
break;
}
switch (polygonCornersNum) {
case 3:
polygonCorners = "Triangle";
break;
case 4:
polygonCorners = "Square";
break;
case 5:
polygonCorners = "Pentagon";
break;
case 6:
polygonCorners = "Hexagon";
break;
case 7:
polygonCorners = "Heptagon";
break;
case 8:
polygonCorners = "Octagon";
break;
}
cameraAngle = radians(decPairs[7] % 360);
cameraDistancePercent = decPairs[8] % 8 * 0.1;
if (polygonCorners == "Triangle") {
cameraDistancePercent = map(cameraDistancePercent, 0, 1, 0.1, 0.6);
}
let patternSizeNum = decPairs[4] % 4;
let patternSize;
switch (patternSizeNum) {
case 0:
patternSize = "Small";
break;
case 1:
patternSize = "Medium";
break;
case 2:
patternSize = "Large";
break;
case 3:
patternSize = "XLarge";
break;
}
let rotatePatternNum = decPairs[6] % 10;
let rotatePattern = rotatePatternNum < 5;
return {
Colors: colorOjbect.name, //String
PolygonCorners: polygonCorners,//String
PatternSize: patternSize,//String
Distance: distance,//String
MultipleDraw: multipleDraw,//Boolean
RotatePattern: rotatePattern,//Boolean
ObjectAngle: objectAngle, //Number
};
}
/**
* color palette for drawing
*/
const colorScheme = [
{
name: "Golden Thread Butterfly",
colors: ["#f19b4e", "#7f6640", "#dc5845", "#e4d6c8", "#929e79", "#472c2a"],
},
{
name: "Navy Lion Peony",
colors: ["#83834f", "#e0c786", "#30363d", "#db2f38", "#66989c", "#e9ded1"],
},
{
name: "Charcoal Wind",
colors: ["#151015", "#511a28", "#8e563a", "#fcfbfa", "#bf9969", "#718282"],
},
{
name: "Wisteria Spring",
colors: ["#e6bc8a", "#da4742", "#202125", "#909062", "#dba380", "#dcc6b9"],
},
{
name: "Fragrant Ground",
colors: ["#73924d", "#eb9f48", "#b19564", "#aabcb2", "#f0e3d7", "#6b4b2b"],
},
{
name: "Lagenaria Siceraria",
colors: ["#f0ebe1", "#d8ccb3", "#cd2a41", "#8bc08f", "#f69fac", "#c4714c"],
},
{
name: "Tang grass",
colors: ["#f9f5ec", "#d8ae6a", "#d4824b", "#588c92", "#89bfb3", "#b55847"],
},
{
name: "Pearl and Dragon",
colors: ["#dad7c3", "#c7895a", "#343530", "#899c63", "#60827d", "#d6b58a"],
},
{
name: "Red Dragon",
colors: ["#e5e9e9", "#da2034", "#8db4bb", "#4f6a31", "#6ab26d", "#e4bc89"],
},
{
name: "Phoenix Peony",
colors: ["#3c3e46", "#ddded7", "#c07552", "#5b6984", "#809c73", "#c3ae98"],
},
{
name: "Kara Ori",
colors: ["#4d4638", "#f77843", "#fbc836", "#d8b85a", "#6c6e47", "#b0e3ee"],
},
{
name: "Yu-Zen Dyeing",
colors: ["#f5da30", "#338ab6", "#8a8740", "#73563f", "#332321", "#e0dfdf"],
},
{
name: "Bird and Flower",
colors: ["#abb163", "#e9e1cb", "#9b7c4a", "#74a7a0", "#e46641", "#5a5925"],
},
{
name: "Japanese Ink",
colors: ["#000000", "#aaaaaa", "#7f7f7f", "#c9c9c9", "#ffffff", "#7f6640"],
},
];
function calculatePortraitAspectRatio(debugMode) {
let scale;
if (debugMode) {
// debugModeがtrueの場合は、MAX_WIDTHとMAX_HEIGHTを使用してキャンバスサイズを設定
scale = 1; // debugModeではスケールは1とする
return { width: MAX_WIDTH, height: MAX_HEIGHT, scale: scale };
} else {
// アスペクト比9:16の基準値
const aspectRatioWidth = 9;
const aspectRatioHeight = 16;
// 画面の幅と高さを取得
let screenWidth = window.innerWidth;
let screenHeight = window.innerHeight;
// 縦長のアスペクト比に基づいて、画面サイズを調整
if (screenWidth / screenHeight > aspectRatioWidth / aspectRatioHeight) {
// 幅が比率に対して大きすぎる場合、高さに基づいて幅を調整
screenWidth = screenHeight * (aspectRatioWidth / aspectRatioHeight);
} else {
// 高さが比率に対して大きすぎる場合、幅に基づいて高さを調整
screenHeight = screenWidth * (aspectRatioHeight / aspectRatioWidth);
}
// スケールを計算(現在の画面サイズに対するMAX_WIDTHとMAX_HEIGHTの比率)
scale = Math.min(screenWidth / MAX_WIDTH, screenHeight / MAX_HEIGHT);
// 計算された幅と高さ、およびスケールをオブジェクトとして返す
return { width: screenWidth, height: screenHeight, scale: scale };
}
}
class Easing {
static easeInSine(x) {
return 1 - Math.cos((x * Math.PI) / 2);
}
static easeOutSine(x) {
return Math.sin((x * Math.PI) / 2);
}
static easeInOutSine(x) {
return -(Math.cos(Math.PI * x) - 1) / 2;
}
static easeInQuad(x) {
return x * x;
}
static easeOutQuad(x) {
return 1 - (1 - x) * (1 - x);
}
static easeInOutQuad(x) {
return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;
}
static easeInCubic(x) {
return x * x * x;
}
static easeOutCubic(x) {
return 1 - Math.pow(1 - x, 3);
}
static easeInOutCubic(x) {
return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;
}
static easeInQuart(x) {
return x * x * x * x;
}
static easeOutQuart(x) {
return 1 - Math.pow(1 - x, 4);
}
static easeInOutQuart(x) {
return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;
}
static easeInQuint(x) {
return x * x * x * x * x;
}
static easeOutQuint(x) {
return 1 - Math.pow(1 - x, 5);
}
static easeInOutQuint(x) {
return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;
}
static easeInExpo(x) {
return x === 0 ? 0 : Math.pow(2, 10 * x - 10);
}
static easeOutExpo(x) {
return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);
}
static easeInOutExpo(x) {
return x === 0 ?
0 :
x === 1 ?
1 :
x < 0.5 ?
Math.pow(2, 20 * x - 10) / 2 :
(2 - Math.pow(2, -20 * x + 10)) / 2;
}
static easeInCirc(x) {
return 1 - Math.sqrt(1 - Math.pow(x, 2));
}
static easeOutCirc(x) {
return Math.sqrt(1 - Math.pow(x - 1, 2));
}
static easeInOutCirc(x) {
return x < 0.5 ?
(1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2 :
(Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;
}
static easeInBack(x) {
const c1 = 1.70158;
const c3 = c1 + 1;
return c3 * x * x * x - c1 * x * x;
}
static easeOutBack(x) {
const c1 = 1.70158;
const c3 = c1 + 1;
return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);
}
static easeInOutBack(x) {
const c1 = 1.70158;
const c2 = c1 * 1.525;
return x < 0.5 ?
(Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2 :
(Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;
}
static easeInElastic(x) {
const c4 = (2 * Math.PI) / 3;
return x === 0 ?
0 :
x === 1 ?
1 :
-Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);
}
static easeOutElastic(x) {
const c4 = (2 * Math.PI) / 3;
return x === 0 ?
0 :
x === 1 ?
1 :
Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;
}
static easeInOutElastic(x) {
const c5 = (2 * Math.PI) / 4.5;
return x === 0 ?
0 :
x === 1 ?
1 :
x < 0.5 ?
-(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2 :
(Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 + 1;
}
static easeInBounce(x) {
return 1 - Easing.easeOutBounce(1 - x);
}
static easeOutBounce(x) {
const n1 = 7.5625;
const d1 = 2.75;
if (x < 1 / d1) {
return n1 * x * x;
} else if (x < 2 / d1) {
return n1 * (x -= 1.5 / d1) * x + 0.75;
} else if (x < 2.5 / d1) {
return n1 * (x -= 2.25 / d1) * x + 0.9375;
} else {
return n1 * (x -= 2.625 / d1) * x + 0.984375;
}
}
static easeInOutBounce(x) {
return x < 0.5 ?
(1 - Easing.easeOutBounce(1 - 2 * x)) / 2 :
(1 + Easing.easeOutBounce(2 * x - 1)) / 2;
}
}
function separateGrid(x, y, d, min_d, target) {
let sepNum = int(random(3, 7));
let w = d / sepNum;
for (let i = x; i < x + d - 1; i += w) {
for (let j = y; j < y + d - 1; j += w) {
if (random(100) < 98 && w > min_d) {
separateGrid(i, j, w, min_d, target);
} else {
target.noStroke();
let distance = dist(
i + w / 2,
j + w / 2,
target.width / 2,
target.height / 2
);
let v =
i + w / 2 > width / 2 ?
distance / (sqrt(2) * d) :
1 - distance / (sqrt(2) * d);
let t = (v / 3) % 2;
let a = constrain(Easing.easeOutSine(t), 0, 1);
let b = constrain(Easing.easeOutSine(t), 0, 1);
let n = int(
noise(
(i / target.width) * 2,
(w / target.height) * 2,
frameCount / 400
) * 9
);
let z = constrain(Easing.easeOutQuint(abs(t - 1)), 0, 1);
let t2 = t;
t = pow(
Easing.easeOutQuint(
noise(x / width, y / height) > 0.5 ?
abs(t - 1) :
pow(abs(t - 1), 1)
),
random(-1, 1)
);
target.push();
target.translate(i + w / 2, j + w / 2);
target.rectMode(CENTER);
target.fill(0);
target.rect(0, 0, w * z, w * z);
target.drawingContext.clip();
target.fill(random(palette));
target.rotate((n * TWO_PI) / 4);
// target.scale(1-t);
switch (n) {
case 0:
target.translate(-w / 2, -w / 2);
target.translate(w * t * 3, 0);
// target.scale(t);
// target.triangle(0, 0, w, 0, 0, w);
target.circle(0, 0, w * 2); // * 2, w * 2, 0, PI / 2, PIE);
target.circle(-w * 3, 0, w * 2); // 0, w * 2, w * 2, 0, PI / 2, PIE);
break;
case 1:
target.translate(-w / 2, -w / 2);
target.translate(w * t * 3, 0);
target.circle(w / 2, w / 2, w * (1 - t));
target.circle(-w * 3 + w / 2, w / 2, w * t);
break;
case 2:
target.translate(-w / 2, -w / 2);
target.translate(w * t * 3, 0);
target.rectMode(CENTER);
target.triangle(-w, 0, 0, w, w, 0);
target.translate(-w * 2, 0);
target.triangle(-w, 0, 0, w, w, 0);
break;
case 3:
target.translate(-w / 2, -w / 2);
target.translate(w * t * 3, 0);
target.rectMode(CENTER);
target.square(w / 2, w / 2, w * (1 - t));
target.square(-w * 3 + w / 2, w / 2, w * t);
break;
case 4:
target.circle(0, 0, w * t * sqrt(2));
break;
case 5:
target.circle(-w / 2, 0, w * 2 * t);
target.circle(+w / 2, 0, w * 2 * (1 - t));
break;
case 6:
target.push();
target.translate(-w / 2, -w / 2);
target.triangle(0, 0, w * t, 0, 0, w * t);
target.pop();
target.push();
target.rotate(PI);
target.translate(-w / 2, -w / 2);
target.triangle(0, 0, w * (1 - t), 0, 0, w * (1 - t));
target.pop();
break;
case 7:
target.push();
target.translate(-w / 2, -w / 2);
target.rectMode(CORNER);
target.rect(0, 0, w * a, w * b);
target.pop();
break;
case 8:
target.push();
target.translate(-w / 2, -w / 2);
target.arc(0, 0, w * t * 2, w * t * 2, 0, PI / 2);
target.pop();
target.push();
target.rotate(PI);
target.translate(-w / 2, -w / 2);
target.arc(0, 0, w * t * 2, w * t * 2, 0, PI / 2);
target.pop();
break;
}
target.pop();
}
}
}
}
}],