Skip to content
Snippets Groups Projects
Verified Commit 605ad852 authored by Tuxilio's avatar Tuxilio
Browse files

wip: rework placement logic

parent 0bcd2826
No related branches found
No related tags found
No related merge requests found
local leds = { local leds = {
30, 32,
20, 28,
10, 16,
5, 8,
2, 4,
} }
local height_increment = 3 local height_increment = 3
local size = (#leds + 1) * 2
local function place_tree(pos) local function breite(n)
local set = {} return n / 4
local iled = 0 end
local blocks_per_layer = {}
for iy = 0, size - 1 do local function is_led(center, breite, pos)
blocks_per_layer[iy] = 0 if math.abs(center.x - pos.x) >= (breite - 1) / 2 and math.abs(center.z - pos.z) >= (breite - 1) / 2 then
for ix = iy, size - 1 - iy do return false
for iz = iy, size - 1 - iy do end
for h = 0, height_increment - 1 do if math.abs(center.x - pos.x) == (breite - 1) / 2 then
table.insert(set, {x = pos.x + ix, y = pos.y + iy * height_increment + h, z = pos.z + iz}) return math.abs(center.z - pos.z) % 2 == 0
iled = iled + 1 end
blocks_per_layer[iy] = blocks_per_layer[iy] + 1 if math.abs(center.z - pos.z) == (breite - 1) / 2 then
return math.abs(center.x - pos.x) % 2 == 0
end
end
local function place_layer(center, breite)
breite = breite * 2 + 1
local needles = {}
local leds = {}
local max_offset = math.ceil(breite / 2)
for y = -height_increment / 2, height_increment / 2 do
for x = -max_offset, max_offset do
for z = -max_offset, max_offset do
local pos = vector.new({x = center.x + x, y = center.y + y, z = center.z + z})
table.insert(needles, pos)
if is_led(center, breite, pos) then
table.insert(leds, pos)
end end
end end
end end
blocks_per_layer[iy] = blocks_per_layer[iy] / height_increment
blocks_per_layer[iy] = math.sqrt(blocks_per_layer[iy]) * 4 - 4
end end
minetest.bulk_set_node(set, {name = "ledtree:pine_needles"}) core.bulk_set_node(needles, {name = "ledtree:pine_needles"})
return leds
local loop_run = 0 end
local id = 0
for iy = 0, size - 1 do
loop_run = loop_run + 1
if loop_run <= #leds then
local led_count = leds[iy + 1]
local led_per_side = math.ceil(led_count / 4)
local layer_size = size - 2 * iy
local led_index = 1
for ix = iy, iy + layer_size - 1 do
for iz = iy, iy + layer_size - 1 do
if led_index <= led_count then
local led_pos = {}
if (ix == iy or ix == iy + layer_size - 1 or iz == iy or iz == iy + layer_size - 1) then
if not ((ix == iy and iz == iy) or (ix == iy and iz == iy + layer_size - 1) or
(ix == iy + layer_size - 1 and iz == iy) or (ix == iy + layer_size - 1 and iz == iy + layer_size - 1)) then
led_pos.x = pos.x + ix
led_pos.z = pos.z + iz
led_pos.y = pos.y + iy * height_increment + math.floor(height_increment / 2)
core.set_node({x = led_pos.x, y = led_pos.y, z = led_pos.z}, {name = "ledtree:led"..id.."_red"}) local function place_leds(led_index, leds)
id = id + 1 for i = 1, #leds do
core.set_node(leds[i], {name = "ledtree:led"..led_index.."_red"})
led_index = led_index + 1
end
return led_index
end
led_index = led_index + 1 local function place_tree(pos)
end local led_index = 0
end for index = 1, #leds do
end local l = leds[index]
end local layer_center = vector.new(pos.x, pos.y + index * height_increment - height_increment / 2, pos.z)
end local leds = place_layer(layer_center, breite(l))
end led_index = place_leds(led_index, leds)
end end
end end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment