Advertisement
osmarks

3DGraph slave

Dec 27th, 2020 (edited)
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.34 KB | None | 0 0
  1. local m = peripheral.find "modem"
  2. local CHAN = 7101
  3. m.open(CHAN)
  4.  
  5. local ephem_ID = math.random(0, 0xFFFFFFF)
  6.  
  7. local function receive()
  8.     while true do
  9.         local _, _, c, rc, ms = os.pullEvent "modem_message"
  10.         if type(ms) == "table" then
  11.             return ms
  12.         end
  13.     end
  14. end
  15.  
  16. local function send(ms) m.transmit(CHAN, CHAN, ms) end
  17.  
  18. local raw_exec_async, pull_event = commands.execAsync, os.pullEvent
  19.  
  20. local tasks = {}
  21. local tasks_debug = {}
  22. local tasks_count = 0
  23. local tasks_limit = 1000
  24. local half_tasks_limit = tasks_limit / 2
  25. local function exec_async(name, ...)
  26.     if tasks_count >= tasks_limit then
  27.         print "task limit reached, blocking"
  28.         while tasks_count >= half_tasks_limit do
  29.             pull_event "task_complete"
  30.         end
  31.         print "blocking complete"
  32.     end
  33.     local id = raw_exec_async(table.concat({name, ...}, " "))
  34.     tasks_count = tasks_count + 1
  35.     tasks[id] = true
  36.     tasks_debug[id] = {name, ...}
  37. end
  38.  
  39. local function fill(ax, ay, az, bx, by, bz, block)
  40.     exec_async("fill", ax, ay, az, bx, by, bz, block, 0, "replace")
  41. end
  42.  
  43. local env = {}
  44. local function add(x) for k, v in pairs(x) do env[k] = v end end
  45. add(math)
  46. add(bit)
  47. add(bit32)
  48. env[vector] = vector
  49.  
  50. local function plot(args)
  51.     print "plotting"
  52.     parallel.waitForAll(function()
  53.         local ax, ay, az = unpack(args.f_min)
  54.         local bx, by, bz = unpack(args.f_max)
  55.         local rx, ry, rz = (bx-ax), (by-ay), (bz-az)
  56.         local fn = load(("local x, y, z = ...; return %s"):format(args.equation), "=eqn", "t", math)
  57.  
  58.         --[[print "Clearing"
  59.         for x = args.x_min, args.x_max do
  60.            
  61.         end
  62.         print "Cleared plot area"]]
  63.  
  64.         for x = args.x_min, args.x_max do
  65.             local go = true
  66.             if args.x_mod and args.x_mod_eq then
  67.                 if x % args.x_mod ~= args.x_mod_eq then
  68.                     go = false
  69.                 end
  70.             end
  71.             if go then
  72.                 -- clear thing
  73.                 fill(x, args.y_min, args.z_min, x, args.y_max, args.z_max, "air")
  74.                 for y = args.y_min, args.y_max do
  75.                     local pz = nil
  76.                     for z = args.z_min, args.z_max do
  77.                         local sx, sy, sz = (((x-ax)/rx)*2)-1, (((y-ay)/ry)*2)-1, (((z-az)/rz)*2)-1
  78.                         --print(sx, sy, sz)
  79.                         local place_here = fn(sx, sy, sz)
  80.                         if place_here and not pz then pz = z
  81.                         elseif pz and not place_here then
  82.                             fill(x, y, pz, x, y, z - 1, args.block)
  83.                             --print(x, y, pz, x, y, z - 1, args.block)
  84.                             pz = nil
  85.                         end
  86.                     end
  87.                     if pz then
  88.                         fill(x, y, pz, x, y, args.z_max, args.block)
  89.                         --print(x, y, pz, x, y, args.z_max, args.block)
  90.                     end
  91.                 end
  92.             end
  93.         end
  94.     end, function()
  95.         while true do
  96.             local event, id, success, result, output = pull_event "task_complete"
  97.             if tasks[id] then
  98.                 tasks_count = tasks_count - 1
  99.                 tasks[id] = nil
  100.                 if not success then
  101.                     error("thing failed: " .. table.concat(output, " "))
  102.                 elseif not result and output[1] ~= "No blocks filled" then
  103.                     printError(table.concat(output, " "))
  104.                     _G.debug_task = tasks_debug[id]
  105.                 end
  106.                 tasks_debug[id] = nil
  107.             end
  108.             if tasks_count == 0 then return end
  109.         end
  110.     end)
  111.  
  112.     return "done"
  113. end
  114.  
  115. while true do
  116.     local ty, arg = unpack(receive())
  117.     if ty == "ping" then send { "pong", ephem_ID }
  118.     elseif ty == "plot" and arg.id == ephem_ID then
  119.         print("plot command received, running", arg.x_min, arg.x_max)
  120.         local ok, err = pcall(plot, arg)
  121.         print(err)
  122.         send { "response", { id = ephem_ID, response = err } }
  123.     end
  124. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement