local BaseRoom = require("rooms.base") local Room = {} Room.__index = Room setmetatable(Room, { __index = BaseRoom }) function Room:new(asset) self = setmetatable(BaseRoom:new(asset), Room) self.time = 0 self.flowSpeed = self.config.flowSpeed or 1.5 self.waveAmplitude = (self.config.waveAmplitude or 4) / Config.ROOM_W self.waveFrequency = self.config.waveFrequency or 3 self.waterTint = self.config.waterTint or { 0.3, 0.6, 1.0, 1.0 } self.tintStrength = self.config.tintStrength or 0.25 local fd = self.config.flowDirection or { 1, 0 } self.flowDirX = fd[1] or 1 self.flowDirY = fd[2] or 0 self.waterMask = asset.imageLoader("water_mask") self.waterShader = love.graphics.newShader [[ extern number time; extern number waveAmplitude; extern number waveFrequency; extern vec4 waterTint; extern number tintStrength; extern number flowDirX; extern number flowDirY; vec4 effect(vec4 color, Image texture, vec2 texCoords, vec2 screenCoords) { vec2 uv = texCoords; float wave1 = sin(uv.x * waveFrequency + time) * waveAmplitude; float wave2 = sin(uv.y * waveFrequency * 0.7 + time * 1.3) * waveAmplitude * 0.5; float wave3 = sin((uv.x + uv.y) * waveFrequency * 0.5 + time * 0.8) * waveAmplitude * 0.3; float displacement = wave1 + wave2 + wave3; uv += vec2(flowDirX, flowDirY) * displacement; vec4 texColor = Texel(texture, uv); return mix(texColor, texColor * waterTint, tintStrength); } ]] self.waterShader:send("waveAmplitude", self.waveAmplitude) self.waterShader:send("waveFrequency", self.waveFrequency) self.waterShader:send("waterTint", self.waterTint) self.waterShader:send("tintStrength", self.tintStrength) self.waterShader:send("flowDirX", self.flowDirX) self.waterShader:send("flowDirY", self.flowDirY) return self end function Room:drawBack() self:drawBackground() self:drawShaderWithMask(self.waterShader, self.waterMask) end function Room:drawFront() end return Room