add optional opts param and swappable get_node

This commit is contained in:
BuckarooBanzay 2024-05-24 13:09:12 +02:00
parent 66d4c5f103
commit da3011f983
6 changed files with 30 additions and 22 deletions

View File

@ -40,10 +40,9 @@ function isogen.get_cube_position(center_x, center_y, cube_len, _, pos)
return x, y
end
function isogen.probe_position(min, max, pos, ipos, list)
list = list or {}
function isogen.probe_position(min, max, pos, ipos, list, get_node)
while vector.in_area(pos, min, max) do
local node = minetest.get_node(pos)
local node = get_node(pos)
local color = isogen.get_color(node)
if color then
local rel_pos = vector.subtract(pos, min)
@ -67,7 +66,6 @@ function isogen.probe_position(min, max, pos, ipos, list)
end
pos = vector.add(pos, ipos)
end
return list
end
local function flip_pos(pos, max, axis)

View File

@ -65,6 +65,6 @@ mtt.register("probe_position", function(callback)
local pos = vector.new(0, 15, 0)
local ipos = vector.new(1, -1, 1)
isogen.probe_position(pos1, pos2, pos, ipos)
isogen.probe_position(pos1, pos2, pos, ipos, {}, minetest.get_node)
callback()
end)

View File

@ -18,15 +18,17 @@ local function color_adjust(c, v)
}
end
function isogen.draw(pos1, pos2, cube_len)
function isogen.draw(pos1, pos2, opts)
opts = opts or {}
opts.cube_len = opts.cube_len or 24
opts.get_node = opts.get_node or minetest.get_node
local min, max = vector.sort(pos1, pos2)
cube_len = cube_len or 24
minetest.load_area(min, max)
local size = vector.add(vector.subtract(max, min), 1)
local width, height = isogen.calculate_image_size(size, cube_len)
local center_x, center_y = isogen.get_center_cube_offset(size, cube_len)
local width, height = isogen.calculate_image_size(size, opts.cube_len)
local center_x, center_y = isogen.get_center_cube_offset(size, opts.cube_len)
local canvas = isogen.create_canvas(width, height)
local ipos = vector.new(1, -1, 1)
@ -35,21 +37,21 @@ function isogen.draw(pos1, pos2, cube_len)
-- top layer
for x=min.x, max.x do
for z=min.z, max.z do
isogen.probe_position(min, max, vector.new(x, max.y, z), ipos, list)
isogen.probe_position(min, max, vector.new(x, max.y, z), ipos, list, opts.get_node)
end
end
-- left layer (without top stride)
for x=min.x, max.x do
for y=min.y, max.y-1 do
isogen.probe_position(min, max, vector.new(x, y, min.z), ipos, list)
isogen.probe_position(min, max, vector.new(x, y, min.z), ipos, list, opts.get_node)
end
end
-- right layer (without top and left stride)
for z=min.z+1, max.z do
for y=min.y, max.y-1 do
isogen.probe_position(min, max, vector.new(min.x, y, z), ipos, list)
isogen.probe_position(min, max, vector.new(min.x, y, z), ipos, list, opts.get_node)
end
end
@ -60,8 +62,8 @@ function isogen.draw(pos1, pos2, cube_len)
for _, entry in ipairs(list) do
local rel_pos = vector.subtract(entry.pos, min)
local color = entry.color
local x, y = isogen.get_cube_position(center_x, center_y, cube_len, 0, rel_pos)
isogen.draw_cube(canvas, cube_len, x, y, color, color_adjust(color, -10), color_adjust(color, 10))
local x, y = isogen.get_cube_position(center_x, center_y, opts.cube_len, 0, rel_pos)
isogen.draw_cube(canvas, opts.cube_len, x, y, color, color_adjust(color, -10), color_adjust(color, 10))
end
return canvas:png()

View File

@ -7,7 +7,7 @@ mtt.register("draw_cube", function(callback)
local canvas = isogen.create_canvas(800, 600)
isogen.draw_cube(canvas, 24, 0, 0, red, green, blue)
isogen.draw_cube(canvas, 24, 0, 0, red, green, blue, minetest.get_node)
local png = canvas:png()
local path = minetest.get_worldpath() .. "/test.png"

View File

@ -1,5 +1,7 @@
function isogen.draw_map(pos1, pos2)
function isogen.draw_map(pos1, pos2, opts)
opts = opts or {}
opts.get_node = opts.get_node or minetest.get_node
pos1, pos2 = vector.sort(pos1, pos2)
minetest.load_area(pos1, pos2)
@ -18,7 +20,7 @@ function isogen.draw_map(pos1, pos2)
-- up-down
for y=pos2.y,pos1.y,-1 do
local pos = vector.new(x, y, z)
local node = minetest.get_node(pos)
local node = opts.get_node(pos)
local color = isogen.get_color(node)
if color then
table.insert(list, color)

View File

@ -32,7 +32,7 @@ Supported node-colors:
# Api
## `isogen.draw(pos1, pos2, cube_len?)`
## `isogen.draw(pos1, pos2, opts?)`
Renders an isometric image and returns the png data
@ -40,15 +40,18 @@ Example:
```lua
local pos1 = vector.new(0,0,0)
local pos2 = vector.new(16,16,16) -- NOTE: larger regions require more memory
local cube_len = 24 -- multiple of 4 and greater than 4 pixels
local opts = { -- optional
cube_len = 24, -- optional: multiple of 4 and greater than 4 pixels
get_node = minetest.get_node -- optional: the get_node() function to use
}
-- render and save to world-directory
local png = isogen.draw(pos1, pos2, cube_len)
local png = isogen.draw(pos1, pos2, opts)
local path = minetest.get_worldpath() .. "/iso.png"
minetest.safe_file_write(path, png)
```
## `isogen.draw_map(pos1, pos2)`
## `isogen.draw_map(pos1, pos2, opts?)`
Renders a map image and returns the png data
@ -56,9 +59,12 @@ Example:
```lua
local pos1 = vector.new(0,0,0)
local pos2 = vector.new(16,16,16) -- NOTE: larger regions require more memory
local opts = { -- optional
get_node = minetest.get_node -- optional: the get_node() function to use
}
-- render and save to world-directory
local png = isogen.draw_map(pos1, pos2)
local png = isogen.draw_map(pos1, pos2, opts)
local path = minetest.get_worldpath() .. "/map.png"
minetest.safe_file_write(path, png)
```