-- Base room visual class BaseRoom = {} BaseRoom.__index = BaseRoom function BaseRoom:new(asset) self = setmetatable({}, BaseRoom) self.time = 0 self.config = asset.config or {} self.background = asset.imageLoader("background") self.maskShader = love.graphics.newShader [[ vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) { if (Texel(texture, texture_coords).rgb == vec3(0.0)) { // a discarded pixel wont be applied as the stencil. discard; } return vec4(1.0); } ]] return self end function BaseRoom:update(dt) self.time = self.time + dt end function BaseRoom:drawBack() end function BaseRoom:drawFront() end function BaseRoom:drawBackground() if self.background then love.graphics.draw(self.background, 0, 0) end end function BaseRoom:drawForeground() end function BaseRoom:drawWithMask(mask) if self.background then if mask then local stencilFunc = function() love.graphics.setShader(self.maskShader) love.graphics.draw(mask, 0, 0) love.graphics.setShader() end love.graphics.stencil(stencilFunc, "replace", 1) love.graphics.setStencilTest("greater", 0) end love.graphics.draw(self.background, 0, 0) love.graphics.setStencilTest() end end function BaseRoom:drawShaderWithMask(shader, mask) if self.background then if mask then shader:send("time", self.time) local stencilFunc = function() love.graphics.setShader(self.maskShader) love.graphics.draw(mask, 0, 0) love.graphics.setShader() end love.graphics.stencil(stencilFunc, "replace", 1) love.graphics.setStencilTest("greater", 0) end love.graphics.setShader(shader) love.graphics.draw(self.background, 0, 0) love.graphics.setShader() love.graphics.setStencilTest() end end return BaseRoom