Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Reference:
- local Effect = requre'effect'
- local shader = love.graphics.newShader[[ -- yet another shader (wawe-effect)
- extern float time = 0;
- extern vec2 point = vec2(0, 0);
- extern float size = 100;
- extern float speed = 1;
- extern float radius = 2;
- float t = time;
- float distance(vec2 x){
- return pow(x.x*x.x + x.y*x.y, 0.5);
- };
- vec4 effect( vec4 color, Image texture, vec2 tc, vec2 sc ){
- vec2 d = point - tc;
- float dist = distance(d*vec2(1.0, 0.65));
- if (dist < radius){
- float delta = (cos(dist/time*speed*10)/2+0.5)/(dist*size);
- vec2 s = vec2(0.8, 0.6)*delta;
- return Texel(texture, tc + d*s)*color;
- }
- else return Texel(texture, tc)*color;
- }
- ]]
- effect = Effect(shader) -- initialisation new shader-effect
- image = love.graphics.newImage('image.png') -- add image
- framebuffer = love.graphics.newCanvas() -- framebuffer
- time = 0
- function love.update(dt)
- love.window.setTitle(love.timer.getFPS())
- eff:update(dt) -- update all shader-instances
- time = time + dt
- end
- function love.mousepressed(x, y, key)
- local x, y = love.mouse.getPosition(0)
- local ix, iy = love.graphics:getDimensions()
- eff:add(x/ix, y/iy, 5) -- add new instance on 0-1 screen position by x/y and 5 seconds lifetime
- end
- function love.draw()
- love.graphics.setCanvas(canvas) -- draw image on canvas
- love.graphics.draw(image)
- eff:draw(canvas) -- apply all shader-instances on canvas
- love.graphics.setCanvas()
- love.graphics.draw(canvas) -- draw it
- love.graphics.circle('line', love.mouse.getX(), love.mouse.getY(), 100)
- end
- ]]
- local function postprocessing()
- local graphics = love.graphics
- local buffer = graphics.newCanvas()
- local resX, resY = graphics.getDimensions()
- return function(canvas, shader, clear)
- assert(canvas:type() == 'Canvas', 'Argument #1 error: love2d-canvas expected. Use post processing only with canvases.')
- assert(shader:type() == 'Shader', 'Argument #2 error: love2d-shader expected.')
- local x, y = graphics.getDimensions()
- if x ~= resX or y ~= resY then buffer = graphics.newCanvas(); resX, resY = x, y end
- graphics.push('all')
- graphics.setCanvas(buffer)
- if clear then graphics.clear(0.0, 0.0, 0.0, 0.0) end
- graphics.setShader(shader) graphics.draw(canvas) graphics.setShader()
- graphics.setCanvas(canvas) graphics.draw(buffer)
- graphics.pop()
- end
- end
- local effect = {}
- setmetatable(effect, {__call =
- function(self, shader)
- local o = {}
- o.post = postprocessing()
- o.list = {}
- o.shader = shader
- self.__index = self
- return setmetatable(o, self)
- end
- })
- function effect:add(x, y, t)
- table.insert(self.list, {x = x, y = y, limit = t, t = 0})
- end
- function effect:update(dt)
- for i, v in ipairs(self.list) do
- v.t = v.t + dt
- if v.t > v.limit then table.remove(self.list, i) end
- end
- end
- function effect:draw(canvas)
- for i, v in ipairs(self.list) do
- self.shader:send('point', {v.x, v.y})
- self.shader:send('time', v.t)
- self.shader:send('size', (v.t+0.5)*200)
- self.post(canvas, self.shader)
- end
- end
- return effect
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement