hill-noise/main.lua

153 lines
4.7 KiB
Lua
Raw Normal View History

2017-03-31 01:23:09 -07:00
lg = love.graphics
W,H = lg.getDimensions()
Histogram = require 'histogram'
2017-03-31 01:23:09 -07:00
local Noise = require "noise"
local DRAW_RES = love.window.toPixels(4)
local SCALE = 100
local font = lg.newFont(love.window.toPixels(24))
local decay = function(x) return .1^x end
local function rng()
local r = love.math.newRandomGenerator(1)
return function() return r:random() end
end
local n1 = Noise.make1d(8,rng(),decay)
local n2 = Noise.make2d(9,rng(),decay)
2017-03-31 01:23:09 -07:00
local n3 = Noise.make3d(11,rng(),decay)
local s1 = Noise.make1dShader(9,rng(),decay)
2017-03-31 01:23:09 -07:00
local s2 = Noise.make2dShader(13,rng(),decay)
local s3 = Noise.make3dShader(17,rng(),decay)
local cw,ch = W/2,H/3
local canv = lg.newCanvas(cw,ch)
function love.load()
xOffset = 0
yOffset = 0
t0 = love.timer.getTime()
love.mouse.setCursor(love.mouse.getSystemCursor("hand"))
end
function love.mousepressed()
love.mouse.setCursor(love.mouse.getSystemCursor("sizeall"))
end
function love.mousereleased()
love.mouse.setCursor(love.mouse.getSystemCursor("hand"))
end
function love.draw()
if love.keyboard.isDown('h') then
lg.setColor(0,100,0)
histogram1:draw()
lg.setColor(0,0,150)
histogram2:draw()
lg.setColor(125,0,0)
histogram3:draw()
end
2017-03-31 01:23:09 -07:00
lg.setColor(255,255,255)
lg.setLineWidth(love.window.toPixels(2))
lg.setLineJoin("none")
local p1 = {}
for x=0,W-H/3,DRAW_RES do
table.insert(p1,x)
table.insert(p1,(1-n1(x/SCALE+xOffset))*H/3)
2017-03-31 01:23:09 -07:00
end
lg.line(p1)
local p2 = {}
local t = love.timer.getTime()-t0
for x=0,W-H/3,DRAW_RES do
table.insert(p2,x)
table.insert(p2,(1+1-n2(x/SCALE+xOffset,t))*H/3)
2017-03-31 01:23:09 -07:00
end
lg.line(p2)
for y=0,H/6*1.2,2*DRAW_RES do
local p3 = {}
for x=0,W-H/3,DRAW_RES do
table.insert(p3,x)
table.insert(p3,2/3*H+H/6*(1-n3(x/SCALE+xOffset,y/SCALE+yOffset,t))+y)
2017-03-31 01:23:09 -07:00
end
lg.line(p3)
end
for x=-H/6,W-H/3,DRAW_RES*2 do
local p3 = {}
local slant = .5
for y=0,H/6*1.2,2*DRAW_RES do
local x2 = x + slant*y
if x2 < -2*DRAW_RES then goto continue end
table.insert(p3,x2)
table.insert(p3,2/3*H+H/6*(1-n3(x2/SCALE+xOffset,y/SCALE+yOffset,t))+y)
2017-03-31 01:23:09 -07:00
if x2 > W/2 then break end
::continue::
end
if #p3 > 2 then
lg.line(p3)
end
end
lg.setShader(s1)
s1:send("range_min", xOffset)
s1:send("range_max", xOffset+2*cw/SCALE)
2017-03-31 01:23:09 -07:00
lg.draw(canv,W-cw,0)
lg.setShader(s2)
s2:send("range_min", {xOffset,yOffset})
s2:send("range_max", {xOffset+2*cw/SCALE,yOffset+2*ch/SCALE})
2017-03-31 01:23:09 -07:00
lg.draw(canv,W-cw,ch)
lg.setShader(s3)
s3:send("range_min", {xOffset,yOffset})
s3:send("range_max", {xOffset+2*cw/SCALE,yOffset+2*ch/SCALE})
2017-03-31 01:23:09 -07:00
s3:send('z', t)
lg.draw(canv,W-cw,2*ch)
lg.setShader(nil)
lg.setColor(0,0,0,100)
lg.rectangle('fill',0,0,W,font:getHeight()+love.window.toPixels(5))
lg.rectangle('fill',0,H/3,W,font:getHeight()+love.window.toPixels(5))
lg.rectangle('fill',0,2*H/3,W,font:getHeight()+love.window.toPixels(5))
lg.setColor(255,230,50)
2017-03-31 01:23:09 -07:00
lg.setFont(font)
lg.printf("1D_Noise(x)", 5,5, W)
lg.printf("2D_Noise(x,time)", 5,5+H/3, W)
lg.printf("3D_Noise(x,y,time)", 5,5+2*H/3, W)
lg.printf("1D_Noise_Shader(x)", 0,5, W-5, 'right')
lg.printf("2D_Noise_Shader(x,y)", 0,5+H/3, W-5, 'right')
lg.printf("3D_Noise_Shader(x,y,time)", 0,5+2*H/3, W-5, 'right')
end
function love.update(dt)
local key = love.keyboard.isDown
local dx = 400/SCALE*dt*((key('right') and 1 or 0) + (key('left') and -1 or 0))
local dy = 400/SCALE*dt*((key('down') and 1 or 0) + (key('up') and -1 or 0))
xOffset = xOffset + dx
yOffset = yOffset + dy
end
function love.keypressed(key)
if key == 'escape' then love.event.quit() end
if key == 'r' then love.load() end
if key == 'h' and not histogram1 then
local data1,data2,data3 = {},{},{}
for i=1,100000 do
local x = math.random()*100000
local y = math.random()*100000
local z = math.random()*100000
table.insert(data1, n1(x))
table.insert(data2, n2(x,y))
table.insert(data3, n3(x,y,z))
end
histogram1 = Histogram:fromList(data1,{pos={x=0,y=0},size={x=W/4,y=H/3},xmin=0,xmax=1,numBuckets=30})
histogram2 = Histogram:fromList(data2,{pos={x=0,y=H/3},size={x=W/4,y=H/3},xmin=0,xmax=1,numBuckets=30})
histogram3 = Histogram:fromList(data3,{pos={x=0,y=2*H/3},size={x=W/4,y=H/3},xmin=0,xmax=1,numBuckets=30})
end
2017-03-31 01:23:09 -07:00
end
function love.mousemoved(x,y,dx,dy)
if love.mouse.isDown(1) then
xOffset = xOffset - dx/SCALE
yOffset = yOffset - dy/SCALE
end
end