xxxxxxxxxx
86
let waterLevel = 0.3;
let sun;
let mapPos;
let heightMap;
let shadowShader;
let heightmapShader;
let voronoiTex;
let sunSetCol;
let midDayCol;
function preload() {
shadowShader = loadShader("/shaders/shader.vert", "/shaders/shadow.frag");
heightmapShader = loadShader("/shaders/shader.vert", "/shaders/heightmap.frag");
voronoiTex = loadImage("voronoi.jpeg");
}
function setup() {
createCanvas(800, 800, WEBGL);
sunSetCol = createVector(0.5, 0.1, 0.1);
midDayCol = createVector(1, 1, 0.9);
heightMap = createGraphics(width, height, WEBGL);
sun = createVector(0, 0.5, 1); // sun at 1 unit high
mapPos = createVector(0, -0.1);
heightMap.shader(heightmapShader);
shader(shadowShader);
generateHeightMap();
}
function draw() {
sun.x = mouseX/width;
sun.y = mouseY/height;
// const secondsPerDay = 4;
// const t = millis()/(secondsPerDay * 1000);
// sun.x = cos(t * PI);
// sun.z = sin(t * PI);
const distSq = pow(sun.x - 0.5, 2) + pow(sun.y - 0.5, 2);
const sunD = sqrt(distSq);
// Make the sun lower in the sky when it's further from the centre
sun.z = constrain(sqrt(1 - sunD * sunD), 0, 1);
const amb = 1 - distSq;
const col = p5.Vector.lerp(sunSetCol, midDayCol, 1 - distSq);
shadowShader.setUniform("voronoiTex", voronoiTex);
shadowShader.setUniform("heightMod", 1);//(sin(millis()/1000) + 1)/2);
shadowShader.setUniform("millis", millis());
shadowShader.setUniform("heightMap", heightMap);
shadowShader.setUniform("sunPos", [sun.x, sun.y, sun.z]);
shadowShader.setUniform("pix", [1/width, 1/height, 0]);
shadowShader.setUniform("waterLevel", waterLevel);
shadowShader.setUniform("ambientStrength", amb * 0.1);
shadowShader.setUniform("ambientColour", [col.x, col.y, col.z]);
shadowShader.setUniform("lightColour", [col.x, col.y, col.z]);
shadowShader.setUniform("res", [width/height, 1]);
clear();
rect(0, 0, width, height);
}
function generateHeightMap() {
heightmapShader.setUniform("mapPos", [mapPos.x, mapPos.y]);
heightmapShader.setUniform("res", [width/height, 1]);
heightMap.clear();
heightMap.rect(0, 0, width, height);
}