lg = love.graphics W,H = lg.getDimensions() Histogram = require 'histogram' 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) local n3 = Noise.make3d(11,rng(),decay) local s1 = Noise.make1dShader(9,rng(),decay) 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 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) 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) 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) 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) 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) 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}) 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}) 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) 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 end function love.mousemoved(x,y,dx,dy) if love.mouse.isDown(1) then xOffset = xOffset - dx/SCALE yOffset = yOffset - dy/SCALE end end