Serge Bazanski | 18c1a26 | 2022-07-07 14:24:53 +0200 | [diff] [blame] | 1 | local NodeManager = class('NodeManager', { |
| 2 | state = 'running', |
| 3 | stateTime = 0, |
| 4 | currentNode = nil, |
| 5 | }) |
| 6 | |
| 7 | function NodeManager:init(config) |
| 8 | self.config = config |
| 9 | self.nodes = {} |
| 10 | self.nodeConfs = {} |
| 11 | |
| 12 | self.currentNode = nil |
| 13 | |
| 14 | print('Initializing NodeManager') |
| 15 | end |
| 16 | |
| 17 | function NodeManager:load() |
| 18 | self:configChanged() |
| 19 | end |
| 20 | |
| 21 | function NodeManager:resize(w, h) |
| 22 | self.secondaryCanvas = love.graphics.newCanvas(w, h) |
| 23 | end |
| 24 | |
| 25 | function NodeManager:configChanged() |
| 26 | local cnt = {} |
| 27 | local newNodes = {} |
| 28 | local newNodeConfs = {} |
| 29 | |
| 30 | for _, c_ in ipairs(self.config.nodes) do |
| 31 | local nodeConfig = lume.clone(c_) |
| 32 | local hash = inspect(nodeConfig) |
| 33 | if cnt[hash] == nil then cnt[hash] = 0 end |
| 34 | cnt[hash] = cnt[hash] + 1 |
| 35 | hash = hash .. '-' .. tostring(cnt[hash]) |
| 36 | |
| 37 | local nodeName = nodeConfig[1] |
| 38 | table.remove(nodeConfig, 1) |
| 39 | |
| 40 | if self.nodeConfs[hash] then |
| 41 | print('Using existing node:', self.nodeConfs[hash], hash) |
| 42 | newNodes[#newNodes + 1] = self.nodeConfs[hash] |
| 43 | else |
| 44 | print('Creating new node.', nodeName, inspect(nodeConfig)) |
| 45 | local status, err = pcall(function() |
| 46 | newNodes[#newNodes + 1] = require(nodeName)(nodeConfig) |
| 47 | end) |
| 48 | if err then |
| 49 | print("Error occured while loading", nodeName, err) |
| 50 | return |
| 51 | end |
| 52 | end |
| 53 | |
| 54 | newNodeConfs[hash] = newNodes[#newNodes] |
| 55 | end |
| 56 | |
| 57 | self.nodes = newNodes |
| 58 | self.nodeConfs = newNodeConfs |
| 59 | end |
| 60 | |
| 61 | function NodeManager:render() |
| 62 | if not self.currentNode then self.currentNode = self.nodes[1] end |
| 63 | if not self.currentNode then return end |
| 64 | |
| 65 | -- love.graphics.print('state: ' .. self.state .. '; counter: ' .. tostring(self.stateTime), 50, 50) |
| 66 | |
| 67 | self.currentNode:render() |
| 68 | |
| 69 | if self.state == 'transitioning' and self.currentNode ~= self.nextNode and self.nextNode then |
| 70 | self.secondaryCanvas:renderTo(function() |
| 71 | self.nextNode:render() |
| 72 | end) |
| 73 | love.graphics.setColor(1.0, 1.0, 1.0, 1.0 * (self.stateTime / self.config.transitionTime)) |
| 74 | love.graphics.draw(self.secondaryCanvas, 0, 0) |
| 75 | end |
| 76 | |
| 77 | love.graphics.setColor(1.0, 1.0, 1.0, 0.3) |
| 78 | |
| 79 | if self.config.showProgress and self.state == 'running' then |
| 80 | local stateTime |
| 81 | stateTime = self.currentNode.displayTime or self.config.displayTime |
| 82 | local h = 5 |
| 83 | love.graphics.rectangle("fill", 0, love.graphics.getHeight() - h, (self.stateTime / stateTime) * love.graphics.getWidth(), h) |
| 84 | end |
| 85 | end |
| 86 | |
| 87 | function NodeManager:update(dt) |
| 88 | if not self.currentNode then self.currentNode = self.nodes[1] end |
| 89 | if not self.currentNode then return end |
| 90 | |
| 91 | self.stateTime = self.stateTime + dt |
| 92 | |
| 93 | if self.state == 'transitioning' and self.stateTime >= self.config.transitionTime then |
| 94 | self.stateTime = 0 |
| 95 | self.state = 'running' |
| 96 | self.currentNode:afterExit() |
| 97 | -- self.currentNode, self.nextNode = self.nextNode, self.nodes[(lume.find(self.nodes, self.nextNode) or 1) % #self.nodes + 1] |
| 98 | self.currentNode = self.nextNode |
| 99 | self.currentNode:afterEnter() |
| 100 | elseif self.state == 'running' and self.stateTime >= (self.currentNode.displayTime or self.config.displayTime) then |
| 101 | self.stateTime = 0 |
| 102 | self.state = 'transitioning' |
| 103 | self.currentNode:beforeExit() |
| 104 | self.nextNode = self.nodes[(lume.find(self.nodes, self.currentNode) or 1) % #self.nodes + 1] |
| 105 | self.nextNode:beforeEnter() |
| 106 | end |
| 107 | |
| 108 | self.currentNode:update(dt) |
| 109 | if self.state == 'transitioning' and self.currentNode ~= self.nextNode and self.nextNode then |
| 110 | self.nextNode:update(dt) |
| 111 | end |
| 112 | end |
| 113 | |
| 114 | return NodeManager |