xxxxxxxxxx
let geom
let env
let blurredEnv
let base
let contactShadowRenderer
function preload() {
env = loadImage('https://deckard.openprocessing.org/user67809/visual2181338/h987a85d77bacbc3b232fb87ce6fe440a/dusseldorf_bridge.jpg')
}
function setup() {
createCanvas(windowWidth, windowHeight, WEBGL)
pixelDensity(1)
contactShadowRenderer = createContactShadowRenderer()
blurredEnv = env.get()
blurredEnv.filter(BLUR, 10)
}
let lastScene = -1
function draw() {
const scene = floor(millis()/8000)
if (scene !== lastScene) {
lastScene = scene
if (geom) freeGeometry(geom)
const block = buildGeometry(() => {
rotate(random([0, 0, PI/2, PI/2, PI/4]))
const divs = random([2, 3, 3, 4, 4, 5, 6])
for (let i = 0; i < divs; i++) {
push()
translate(0, map(i, 0, divs-1, -100, 100))
box(200, 150/divs, 200)
pop()
}
})
const segment = buildGeometry(() => {
const numStacked = random([2, 3, 4, 5])
push()
translate(0, -200*(numStacked-1)/2)
cylinder(20, 200*numStacked)
pop()
for (let i = 0; i < numStacked; i++) {
rotateY(random(TWO_PI))
model(block)
translate(0, -200)
translate(random(-50, 50), 0, random(-50, 50))
}
})
geom = buildGeometry(() => {
if (random() > 0.4) {
const repeats = random([2, 3, 4, 5])
for (let i = 0; i < repeats; i++) {
push()
rotateY(i/repeats * TWO_PI)
push()
translate(0, 0, 200)
model(segment)
pop()
pop()
}
} else {
const x = random([2, 3, 4])
const z = random([2, 3, 4])
for (let i = 0; i < x; i++) {
for (let j = 0; j < z; j++) {
push()
translate(
map(i, 0, x-1, -1, 1) * x * 100,
0,
map(j, 0, z-1, -1, 1) * z * 100,
)
model(segment)
pop()
}
}
}
})
geom.normalize()
geom.clearColors()
base = max(geom.vertices.map(v => v.y))
}
contactShadowRenderer.draw(() => {
background(255)
const angle = millis() * 0.00025
camera(800*cos(angle), base+20, 800*sin(angle), 0, 0, 0)
panorama(blurredEnv)
imageLight(env)
lights()
noStroke()
scale(min(width, height)/350)
push()
fill(130)
specularMaterial(50)
shininess(80)
directionalLight(50, 50, 50, 0, 0.5, -0.5)
// rotateY(millis() * 0.00025)
model(geom)
pop()
push()
fill(100)
specularMaterial(50)
shininess(5)
translate(0, base)
rotateX(PI/2)
plane(2000, 2000)
pop()
})
}