bloom.lua 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. local Bloom = {}
  2. local g = love.graphics
  3. function Bloom:init()
  4. self:resize()
  5. self.alpha = 0
  6. end
  7. function Bloom:update()
  8. local p = ctx.player
  9. local alphas = config.effects[ctx.biome].bloom.alpha
  10. self.alpha = lume.lerp(self.alpha, p.dead and alphas[2] or alphas[1], 2 * ls.tickrate)
  11. self.active = self.alpha > 5
  12. end
  13. function Bloom:applyEffect(source, target)
  14. local p = ctx.player
  15. local w, h = g.getWidth(), g.getHeight()
  16. local threshold = data.media.shaders.threshold
  17. g.setColor(255, 255, 255)
  18. g.setCanvas(self.canvas)
  19. threshold:send('threshold', .8)
  20. g.setShader(threshold)
  21. g.draw(source, 0, 0, 0, .25, .25)
  22. self.hblur:send('amount', 4 / w)
  23. self.vblur:send('amount', 4 / h)
  24. for i = 1, 3 do
  25. g.setShader(self.hblur)
  26. g.setCanvas(self.working)
  27. g.draw(self.canvas)
  28. g.setShader(self.vblur)
  29. g.setCanvas(self.canvas)
  30. g.draw(self.working)
  31. end
  32. g.setShader()
  33. g.setCanvas(target)
  34. g.draw(source)
  35. g.setColor(255, 255, 255, self.alpha)
  36. g.setBlendMode('additive')
  37. g.draw(self.canvas, 0, 0, 0, 4, 4)
  38. g.setBlendMode('alpha')
  39. end
  40. function Bloom:resize()
  41. local w, h = g.getDimensions()
  42. self.canvas = g.newCanvas(w / 4, h / 4)
  43. self.working = g.newCanvas(w / 4, h / 4)
  44. self.threshold = love.graphics.newShader('media/shaders/threshold.shader')
  45. self.hblur = love.graphics.newShader('media/shaders/horizontalBlur.shader')
  46. self.vblur = love.graphics.newShader('media/shaders/verticalBlur.shader')
  47. end
  48. return Bloom