blob: 69af96b5d816542257dd04028c17548bd901ec11 [file] [log] [blame]
Serge Bazanski18c1a262022-07-07 14:24:53 +02001local NodeManager = class('NodeManager', {
2 state = 'running',
3 stateTime = 0,
4 currentNode = nil,
5})
6
7function NodeManager:init(config)
8 self.config = config
9 self.nodes = {}
10 self.nodeConfs = {}
11
12 self.currentNode = nil
13
14 print('Initializing NodeManager')
15end
16
17function NodeManager:load()
18 self:configChanged()
19end
20
21function NodeManager:resize(w, h)
22 self.secondaryCanvas = love.graphics.newCanvas(w, h)
23end
24
25function 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
59end
60
61function 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
85end
86
87function 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
112end
113
114return NodeManager