From bfb8b3dc419c9970144ad76e94b7708057cbbf4c Mon Sep 17 00:00:00 2001 From: retrisma Date: Mon, 3 Jun 2024 21:01:51 -0400 Subject: [PATCH] a start on shaders --- Tiled/Maps/Exports/slime.lua | 15 ++++++++++++++- Tiled/Maps/slime.tmx | 3 ++- camera.lua | 3 +++ main.lua | 21 +++++++++++++++++++++ map.lua | 5 ++++- shaders.lua | 36 ++++++++++++++++++++++++++++++++++++ 6 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 shaders.lua diff --git a/Tiled/Maps/Exports/slime.lua b/Tiled/Maps/Exports/slime.lua index a60e1e8..8fd2d7f 100644 --- a/Tiled/Maps/Exports/slime.lua +++ b/Tiled/Maps/Exports/slime.lua @@ -10,7 +10,7 @@ return { tilewidth = 16, tileheight = 16, nextlayerid = 8, - nextobjectid = 73, + nextobjectid = 74, properties = {}, tilesets = { { @@ -9249,6 +9249,19 @@ return { rotation = 0, visible = true, properties = {} + }, + { + id = 73, + name = "light", + type = "", + shape = "rectangle", + x = 608, + y = 2177, + width = 0, + height = 0, + rotation = 0, + visible = true, + properties = {} } } }, diff --git a/Tiled/Maps/slime.tmx b/Tiled/Maps/slime.tmx index 24700d2..9998f04 100644 --- a/Tiled/Maps/slime.tmx +++ b/Tiled/Maps/slime.tmx @@ -1,5 +1,5 @@ - + @@ -359,6 +359,7 @@ + diff --git a/camera.lua b/camera.lua index b03b280..f095e8a 100644 --- a/camera.lua +++ b/camera.lua @@ -62,4 +62,7 @@ function updatecamera(dt) camera.fx = math.floor(camera.rx) camera.fy = math.floor(camera.ry) + + basic.shader:send("camera_pos", {camera.fx, camera.fy}) + basic.shader:send("camera_scale", camera.scale) end \ No newline at end of file diff --git a/main.lua b/main.lua index 985b2b9..0e9dd43 100644 --- a/main.lua +++ b/main.lua @@ -11,11 +11,14 @@ require "actor" require "player" require "triggers" require "tools" +require "shaders" require "drawing" +fmod = require "fmodlove" sti = require "lib/sti" moonshine = require "lib/moonshine" window = { width = 800, height = 460, scale = 1.3 } +canvas = love.graphics.newCanvas(window.width * window.scale, window.height * window.scale) speed = { target = 1 / 60, multiplier = 1 } @@ -34,6 +37,13 @@ function love.load() love.graphics.setDefaultFilter("nearest", "nearest") loadassets() + + fmod.init(0, 32, 64, 1) + + bi1 = fmod.loadBank("FMOD/Desktop/Master.bank", 0) + bi2 = fmod.loadBank("FMOD/Desktop/Master.strings.bank", 0) + + fmod.setNumListeners(1) font = love.graphics.setFont(fonts["ElixiR"]) map = loadmap("slime") @@ -41,6 +51,8 @@ function love.load() for _,v in pairs(p) do if v.user == "player" then player = v break end end + + basic.setup() end function love.update(dt) @@ -70,11 +82,15 @@ function love.update(dt) end end + basic.update() + mouse.op = mouse.p end function love.draw() --draw tiled map + love.graphics.setCanvas(canvas) + love.graphics.clear() map:draw(camera.fx * -1, camera.fy * -1, window.scale, window.scale) love.graphics.push() @@ -94,6 +110,11 @@ function love.draw() love.graphics.circle("fill", mouse.x, mouse.y, 3) love.graphics.pop() + love.graphics.setCanvas() + + love.graphics.setShader(basic.shader) + love.graphics.draw(canvas) + love.graphics.setShader() --if showdebug then love.graphics.print(printdebug(), 0, 0) diff --git a/map.lua b/map.lua index c1b2bc0..e801c6f 100644 --- a/map.lua +++ b/map.lua @@ -14,7 +14,10 @@ spawntable = { table.insert(p, a) end, - + light = function(v) + local data = getobjectdata(v) + table.insert(basic.lights, {data.x, data.y}) + end, CamLockY = function(v) local data = getobjectdata(v) CameraLockTrigger:add(data.x, data.y, data.width, data.height, false, data.y) diff --git a/shaders.lua b/shaders.lua new file mode 100644 index 0000000..d6f3105 --- /dev/null +++ b/shaders.lua @@ -0,0 +1,36 @@ +basic = { + lights = {} +} + +basic.shader = love.graphics.newShader[[ + uniform vec2[1] light_pos; + uniform vec2 camera_pos; + uniform float camera_scale; + uniform vec2 player_pos; + + vec2 world_transform(vec2 world_coords) { + return (world_coords - camera_pos) * camera_scale; + } + + float light_source(vec2 screen_coords, vec2 light, float falloff) { + float d = distance(screen_coords, world_transform(light)); + float intensity = 1.5 - (d / falloff); + return clamp(intensity, 1.0, 0.0); + } + + vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) { + vec4 pixel = Texel(texture, texture_coords); + + float intensity = clamp(light_source(screen_coords, light_pos[0], 1000) + light_source(screen_coords, player_pos, 150), 0.4, 1.0); + + return pixel * intensity; + } +]] + +function basic.setup() + basic.shader:send("light_pos", unpack(basic.lights)) +end + +function basic.update() + basic.shader:send("player_pos", {player.x + player.width / 2, player.y + player.height / 2}) +end \ No newline at end of file