xxxxxxxxxx
229
//--------------------------------------------------
//
// ジェネラティブな風景
// Haukun
// 2023/06/27
//
// CC BY-NC-SA 3.0
// https://creativecommons.org/licenses/by-nc-sa/3.0/
//--------------------------------------------------
var CTEX,MTEX,PTEX,FTEX,OTEX
var t=0
var SEED=1200
//var SEED=300000
function setup() {
createCanvas(1920,1080);
//scale(.55,.55);
fill(40,40,80)
rect(0,0,width,height);
CTEX = createTex(width, height /2)
drawSky(CTEX)
image(CTEX,0,0)
MTEX = createTex(width, height / 2)
drawMountain(MTEX)
image(MTEX,0,0)
PTEX = createTex(width, height / 2)
drawPond(PTEX)
image(PTEX,0,height/2)
FTEX = createTex(width, 200)
drawForest(FTEX)
image(FTEX,0,height/2-100)
OTEX = createTex(width, height, WEBGL)
OTEX.setAttributes("alpha",true)
drawObject(OTEX)
image(OTEX,0,0)
print(millis())
noLoop()
}
/*
function draw(){
t++;
scale(0.6,0.6);
image(CTEX,0,0)
image(MTEX,0,0)
image(PTEX,0,height/2)
drawObject(OTEX)
image(OTEX,0,0)
}*/
function drawObject(target){
with(target){
clear()
push()
var islandCount = int(random(5));
for(var i=0;i<islandCount;i++){
drawIsland(target);
}
pop()
}
}
function createIslandTexture(){
islandTexture=createGraphics(512,512)
islandTexture.colorMode(HSB)
islandTexture.background(120,100,10)
islandTexture.rectMode(CENTER)
islandTexture.noStroke()
for(i=0;i<1000;i++){
islandTexture.fill(random(90)+75,random(50),random(20))
islandTexture.square(random(512),random(512),random(50))
}
// for debug : islandTexture.square(0,0,512)
return islandTexture;
}
function drawIsland(target){
with(target){
seed = random()*99;
ISLAND_TEX = createIslandTexture();
push();
textureMode(NORMAL)
beginShape(TRIANGLE_STRIP)
var X=random(width*2)-width
var H=random(600)+300;
var Z=random(-5000)-1000
var F=0
var islandSize = int(random(10));
for(var l=1;l<=islandSize;l++){ // Island size
for(var i=0;i<=islandSize+2;i++){ // Coastline detail
var R=TAU/(islandSize+2)
var L=(l-1)*200*noise(sin(i/9-PI/2),seed)*2
Y=noise(cos(i*R)*L/200,sin(i*R)*L/200,seed)*H*cos((l-1)/(islandSize)*PI/2)
vertex(cos(i*R)*L+X,550-Y,sin(i*R)*L+Z,F?0:1,0)
L=l*200*noise(sin(i/9-PI/2),seed)*2
Y=l==islandSize?0:noise(cos(i*R)*L/200,sin(i*R)*L/200,seed)*H*cos(l/(islandSize)*PI/2)
vertex(VX=cos(i*R)*L+X,VY=550-Y,VZ=sin(i*R)*L+Z,F?0:1,1)
F=++F%2
// Draw leaf
for(k=0;k<l*10;k++)
{
rOffset=random(islandSize/10)-(islandSize/20)
L=(l-1)*200*noise(sin(i/9-PI/2),seed)*2-random(l*10)
push()
fill(120,50,random(50))
translate(VX=cos(i*R+rOffset)*L+X,500-Y,VZ=sin(i*R+rOffset)*L+Z)
rotateX(random(1)-.5)
rotateZ(random(1)-.5)
ellipse(0,0,5,LH=random(100))
// Add flower
if(random(1)<.1){
fill(random(360),50,100,.8);
circle(0,-LH,random(20));
}
pop()
}
}
}
texture(ISLAND_TEX)
endShape()
fill(240,100,5,.7);
beginShape(TRIANGLE_STRIP)
for(var l=islandSize+1;l<islandSize+2;l++){ // Island size
for(var i=0;i<=islandSize+2;i++){ // Coastline detail
var R=TAU/(islandSize+2)
var L=(l-1)*200*noise(sin(i/9-PI/2),seed)*2
Y=0
vertex(cos(i*R)*L+X,550-Y,sin(i*R)*L+Z)
L=l*200*noise(sin(i/9-PI/2),seed)*2-50
Y=0
vertex(VX=cos(i*R)*L+X,VY=550-Y,VZ=sin(i*R)*L+Z)
}
}
endShape()
pop();
}
}
function drawRoad(target){
X=createGraphics(5,9)
X.colorMode(HSB)
X.noStroke()
for(i=0;i<9;i++){
X.fill(0,50,20-i*3)
X.rect(0,i,5,1)
}
Y=createGraphics(5,5)
Y.colorMode(HSB)
Y.background(0,50,20,.5)
Z=createGraphics(5,5)
Z.colorMode(HSB)
Z.noStroke()
for(i=0;i<9;i++){
Z.fill(0,20+i*5,20-i*3)
Z.rect(0,i,5,1)
}
with(target){
clear()
push()
rectMode(CENTER)
fill(0,50,3)
push()
for(l=0;l<3;l++){
beginShape()
if(l==0){
texture(Y)
}else if(l==1){
texture(X)
}else{
texture(Z)
}
vertex(0,550,0,0,0)
for(z=0;z>-8000;z-=20){
vertex(noise(z*.0005)*1500-(l*200),530,z,5,(-z/8000)*9)
}
vertex(0,550,-8000,0,9)
endShape()
}
pop()
push()
for(l=0;l<3;l++){
beginShape()
if(l==0){
texture(Y)
}else if(l==1){
texture(X)
}else{
texture(Z)
}
vertex(0,550,0,0,0)
for(z=0;z>-8000;z-=20){
vertex(-noise(z*.0005,9)*1500+(l*200),530,z,5,(-z/8000)*9)
}
vertex(0,550,-8000,0,9)
endShape()
}
pop()
pop()
}
}