add optional opts param and swappable get_node
This commit is contained in:
parent
66d4c5f103
commit
da3011f983
@ -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)
|
||||
|
@ -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)
|
20
draw.lua
20
draw.lua
@ -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()
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
|
16
readme.md
16
readme.md
@ -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)
|
||||
```
|
||||
|
Loading…
x
Reference in New Issue
Block a user