Initial commit
This commit is contained in:
147
sim/group.lua
Normal file
147
sim/group.lua
Normal file
@@ -0,0 +1,147 @@
|
||||
Group = {}
|
||||
|
||||
function Group:new()
|
||||
local o = {
|
||||
state = false,
|
||||
fxstate = false,
|
||||
updatetick = 0,
|
||||
wires = {},
|
||||
out_ports = {},
|
||||
in_ports = {},
|
||||
|
||||
nwires = 0,
|
||||
nout_ports = 0,
|
||||
nin_ports = 0
|
||||
}
|
||||
setmetatable(o, self)
|
||||
self.__index = self
|
||||
return o
|
||||
end
|
||||
|
||||
function Group:getsize()
|
||||
return self.nwires + self.nout_ports + self.nin_ports
|
||||
end
|
||||
|
||||
function Group:addwire(wire)
|
||||
if wire.group ~= self then
|
||||
if wire.group ~= nil then
|
||||
self:mergewith(wire.group)
|
||||
else
|
||||
self.wires[wire] = wire
|
||||
self.nwires = self.nwires + 1
|
||||
|
||||
wire.group = self
|
||||
wire:update()
|
||||
sim:queuegroup(self)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Group:removewire(wire)
|
||||
wire.group = nil
|
||||
self.wires[wire] = nil
|
||||
|
||||
for k, wire in pairs(self.wires) do
|
||||
wire.group = nil
|
||||
end
|
||||
|
||||
for k, port in pairs(self.out_ports) do
|
||||
port.group = nil
|
||||
end
|
||||
|
||||
for k, port in pairs(self.in_ports) do
|
||||
port.group = nil
|
||||
end
|
||||
|
||||
for k, wire in pairs(self.wires) do
|
||||
sim:connectwire(wire)
|
||||
end
|
||||
|
||||
for k, port in pairs(self.out_ports) do
|
||||
sim:connectport(port)
|
||||
end
|
||||
|
||||
for k, port in pairs(self.in_ports) do
|
||||
sim:connectport(port)
|
||||
end
|
||||
|
||||
self.wires = {}
|
||||
self.out_ports = {}
|
||||
self.in_ports = {}
|
||||
|
||||
self.nwires = 0
|
||||
self.nout_ports = 0
|
||||
self.nin_ports = 0
|
||||
end
|
||||
|
||||
function Group:addport(port)
|
||||
port.group = self
|
||||
|
||||
if port.type == PortTypes.output then
|
||||
self.out_ports[port] = port
|
||||
self.nout_ports = self.nout_ports + 1
|
||||
sim:queuegroup(self)
|
||||
elseif port.type == PortTypes.input then
|
||||
self.in_ports[port] = port
|
||||
self.nin_ports = self.nin_ports + 1
|
||||
port:setinputstate(self.state)
|
||||
end
|
||||
end
|
||||
|
||||
function Group:removeport(port)
|
||||
if port.type == PortTypes.output then
|
||||
self.out_ports[port] = nil
|
||||
self.nout_ports = self.nout_ports - 1
|
||||
elseif port.type == PortTypes.input then
|
||||
self.in_ports[port] = nil
|
||||
self.nin_ports = self.nin_ports - 1
|
||||
end
|
||||
|
||||
sim:queuegroup(self)
|
||||
end
|
||||
|
||||
function Group:mergewith(group)
|
||||
if self:getsize() >= group:getsize() then
|
||||
group:mergeinto(self)
|
||||
return self
|
||||
else
|
||||
self:mergeinto(group)
|
||||
return group
|
||||
end
|
||||
end
|
||||
|
||||
function Group:mergeinto(group)
|
||||
for k, wire in pairs(self.wires) do
|
||||
wire.group = nil
|
||||
group:addwire(wire)
|
||||
end
|
||||
|
||||
for k, port in pairs(self.out_ports) do
|
||||
group:addport(port)
|
||||
end
|
||||
|
||||
for k, port in pairs(self.in_ports) do
|
||||
group:addport(port)
|
||||
end
|
||||
|
||||
self.wires = {}
|
||||
self.out_ports = {}
|
||||
self.in_ports = {}
|
||||
|
||||
self.nwires = 0
|
||||
self.nout_ports = 0
|
||||
self.nin_ports = 0
|
||||
end
|
||||
|
||||
function Group:setstate(state)
|
||||
if state ~= self.state then
|
||||
self.state = state
|
||||
self.updatetick = sim.currenttick
|
||||
|
||||
for k, port in pairs(self.in_ports) do
|
||||
port:setinputstate(state)
|
||||
end
|
||||
|
||||
sim:queuegroupfx(self)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user