diff --git a/game/engines/default/engine/Target.lua b/game/engines/default/engine/Target.lua index 2b3627bb2a52d1bd97b73fac1a3bd97b9445e941..ebb5f90e61f6d7ac8a24c1833a9fc8bae38a28d2 100644 --- a/game/engines/default/engine/Target.lua +++ b/game/engines/default/engine/Target.lua @@ -19,6 +19,7 @@ require "engine.class" local Map = require "engine.Map" +local Shader = require "engine.Shader" --- handles targetting module(..., package.seeall, class.make) @@ -37,19 +38,19 @@ function _M:init(map, source_actor) local pot_width = math.pow(2, math.ceil(math.log(map.tile_w-0.1) / math.log(2.0))) local pot_height = math.pow(2, math.ceil(math.log(map.tile_h-0.1) / math.log(2.0))) self.sr = core.display.newSurface(pot_width, pot_height) - self.sr:erase(255, 0, 0, 90) + self.sr:erase(255, 0, 0, 150) self.sr = self.sr:glTexture() self.sb = core.display.newSurface(pot_width, pot_height) - self.sb:erase(0, 0, 255, 90) + self.sb:erase(0, 0, 255, 150) self.sb = self.sb:glTexture() self.sg = core.display.newSurface(pot_width, pot_height) - self.sg:erase(0, 255, 0, 90) + self.sg:erase(0, 255, 0, 150) self.sg = self.sg:glTexture() self.sy = core.display.newSurface(pot_width, pot_height) - self.sy:erase(255, 255, 0, 90) + self.sy:erase(255, 255, 0, 150) self.sy = self.sy:glTexture() self.syg = core.display.newSurface(pot_width, pot_height) - self.syg:erase(153, 204, 50, 90) + self.syg:erase(153, 204, 50, 150) self.syg = self.syg:glTexture() self.source_actor = source_actor @@ -62,6 +63,14 @@ function _M:init(map, source_actor) -- setmetatable(self.target, {__mode='v'}) end +function _M:enableFBORenderer(shader) + self.fbo = core.display.newFBO(Map.viewport.width, Map.viewport.height) + if not self.fbo then return end + if shader then + self.fbo_shader = Shader.new(shader) + end +end + function _M:displayArrow(sx, sy, tx, ty, full) local x, y = (tx*2.5 + sx) / 3.5, (ty*2.5 + sy) / 3.5 @@ -77,7 +86,27 @@ function _M:displayArrow(sx, sy, tx, ty, full) core.display.glMatrix(false) end -function _M:display(dispx, dispy) +function _M:display(dispx, dispy, prevfbo) + local ox, oy = self.display_x, self.display_y + local sx, sy = game.level.map._map:getScroll() + sx = sx + game.level.map.display_x + sy = sy + game.level.map.display_y + self.display_x, self.display_y = dispx or sx or self.display_x, dispy or sy or self.display_y + + if not self.fbo then + self:realDisplay(self.display_x, self.display_y) + else + self.fbo:use(true, 0, 0, 0, 0) + self:realDisplay(0, 0) + self.fbo:use(false, prevfbo) + self.fbo:toScreen(self.display_x, self.display_y, Map.viewport.width, Map.viewport.height, nil, 1, 1, 1, 1, true) + self.fbo:toScreen(self.display_x, self.display_y, Map.viewport.width, Map.viewport.height, self.fbo_shader.shad, 1, 1, 1, 1, true) + end + + self.display_x, self.display_y = ox, oy +end + +function _M:realDisplay(dispx, dispy) -- Make sure we have a source if not self.target_type.source_actor then self.target_type.source_actor = self.source_actor @@ -92,13 +121,8 @@ function _M:display(dispx, dispy) self.target_type.start_x = self.target_type.start_x or self.target_type.x or self.target_type.source_actor and self.target_type.source_actor.x or self.x self.target_type.start_y = self.target_type.start_y or self.target_type.y or self.target_type.source_actor and self.target_type.source_actor.y or self.y - local ox, oy = self.display_x, self.display_y - local sx, sy = game.level.map._map:getScroll() - sx = sx + game.level.map.display_x - sy = sy + game.level.map.display_y - self.display_x, self.display_y = dispx or sx or self.display_x, dispy or sy or self.display_y --- self.cursor:toScreen(self.display_x + (self.target.x - game.level.map.mx) * self.tile_w * Map.zoom, self.display_y + (self.target.y - game.level.map.my) * self.tile_h * Map.zoom, self.tile_w * Map.zoom, self.tile_h * Map.zoom) +-- self.cursor:toScreen(dispx + (self.target.x - game.level.map.mx) * self.tile_w * Map.zoom, dispy + (self.target.y - game.level.map.my) * self.tile_h * Map.zoom, self.tile_w * Map.zoom, self.tile_h * Map.zoom) -- Do not display if not requested if not self.active then return end @@ -107,16 +131,16 @@ function _M:display(dispx, dispy) if util.isHex() then display_highlight = function(texture, tx, ty) texture:toScreenHighlightHex( - self.display_x + (tx - game.level.map.mx) * self.tile_w * Map.zoom, - self.display_y + (ty - game.level.map.my + util.hexOffset(tx)) * self.tile_h * Map.zoom, + dispx + (tx - game.level.map.mx) * self.tile_w * Map.zoom, + dispy + (ty - game.level.map.my + util.hexOffset(tx)) * self.tile_h * Map.zoom, self.tile_w * Map.zoom, self.tile_h * Map.zoom) end else display_highlight = function(texture, tx, ty) texture:toScreen( - self.display_x + (tx - game.level.map.mx) * self.tile_w * Map.zoom, - self.display_y + (ty - game.level.map.my) * self.tile_h * Map.zoom, + dispx + (tx - game.level.map.mx) * self.tile_w * Map.zoom, + dispy + (ty - game.level.map.my) * self.tile_h * Map.zoom, self.tile_w * Map.zoom, self.tile_h * Map.zoom) end @@ -206,7 +230,7 @@ function _M:display(dispx, dispy) end if not self.target_type.immediate_keys or firstx then - self.cursor:toScreen(self.display_x + (self.target.x - game.level.map.mx) * self.tile_w * Map.zoom, self.display_y + (self.target.y - game.level.map.my + util.hexOffset(self.target.x)) * self.tile_h * Map.zoom, self.tile_w * Map.zoom, self.tile_h * Map.zoom) + self.cursor:toScreen(dispx + (self.target.x - game.level.map.mx) * self.tile_w * Map.zoom, dispy + (self.target.y - game.level.map.my + util.hexOffset(self.target.x)) * self.tile_h * Map.zoom, self.tile_w * Map.zoom, self.tile_h * Map.zoom) end if self.target_type.ball and self.target_type.ball > 0 then @@ -281,8 +305,6 @@ function _M:display(dispx, dispy) self:displayArrow(self.target_type.start_x, self.target_type.start_y, spot[1], spot[2], firstx == spot[1] and firsty == spot[2]) end end - - self.display_x, self.display_y = ox, oy end -- @return t The target table used by ActorProject, Projectile, GameTargeting, etc. diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 4be7c91631a73d364f5bbd0d2d73562568be4239..765251cefb17d6f13c18cb551a2f8a3c9768c84b 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -134,6 +134,7 @@ function _M:runReal() if not self.player then self:newGame() end engine.interface.GameTargeting.init(self) + if self.target then self.target:enableFBORenderer("invis_edge") end self.uiset.hotkeys_display.actor = self.player self.uiset.npcs_display.actor = self.player @@ -1358,13 +1359,13 @@ function _M:displayMap(nb_keyframes) _2DNoise:bind(1, false) self.fbo2:toScreen(map.display_x, map.display_y, map.viewport.width, map.viewport.height, self.fbo_shader.shad) - if self.target then self.target:display() end + if self.target then self.target:display(nil, nil, self.full_fbo) end -- Basic display; no FBOs else if self.level.data.background then self.level.data.background(self.level, map.display_x, map.display_y, nb_keyframes) end map:display(nil, nil, nb_keyframes, config.settings.tome.smooth_fov) - if self.target then self.target:display() end + if self.target then self.target:display(nil, nil, self.full_fbo) end if self.level.data.foreground then self.level.data.foreground(self.level, map.display_x, map.display_y, nb_keyframes) end if self.level.data.weather_particle then self.state:displayWeather(self.level, self.level.data.weather_particle, nb_keyframes) end if self.level.data.weather_shader then self.state:displayWeatherShader(self.level, self.level.data.weather_shader, map.display_x, map.display_y, nb_keyframes) end diff --git a/game/modules/tome/data/gfx/shaders/mm_fbo.lua b/game/modules/tome/data/gfx/shaders/mm_fbo.lua index 6aac51e1be541ccfb4b1986dff09a6b8695e09ab..5f85eeb4d6d3b0ac66053434d5dc8db2d0e144fc 100644 --- a/game/modules/tome/data/gfx/shaders/mm_fbo.lua +++ b/game/modules/tome/data/gfx/shaders/mm_fbo.lua @@ -23,4 +23,5 @@ return { args = { }, clone = false, + permanent = true, }