diff --git a/.luacheckrc b/.luacheckrc index 17eb7be..51cf3a2 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -14,5 +14,5 @@ read_globals = { "minetest", -- mods - "mapblock_lib", "mtt", "Promise" + "mapblock_lib", "mtt", "Promise", "isogen" } diff --git a/api.lua b/api.lua index b56dab3..056378a 100644 --- a/api.lua +++ b/api.lua @@ -29,6 +29,7 @@ function building_lib.register_building(name, def) error("unexpected modname: '" .. parts[1] .. "' expected: " .. minetest.get_current_modname()) end + def.modname = parts[1] buildings[name] = def end diff --git a/init.lua b/init.lua index e32d27f..c450495 100644 --- a/init.lua +++ b/init.lua @@ -28,6 +28,11 @@ dofile(MP .. "/events.lua") dofile(MP .. "/hacks.lua") dofile(MP .. "/mapgen.lua") +local ie = minetest.request_insecure_environment() +if ie and minetest.get_modpath("isogen") then + loadfile(MP .. "/previewgen.lua")(ie) +end + if minetest.get_modpath("mtt") and mtt.enabled then dofile(MP .. "/events.spec.lua") dofile(MP .. "/conditions.spec.lua") diff --git a/mod.conf b/mod.conf index 2f0d70c..39e16c4 100644 --- a/mod.conf +++ b/mod.conf @@ -1,4 +1,4 @@ name = building_lib description = Mapblock granular building placement and tools depends = mapblock_lib, promise, wield_events -optional_depends = mtt \ No newline at end of file +optional_depends = mtt, isogen \ No newline at end of file diff --git a/previewgen.lua b/previewgen.lua new file mode 100644 index 0000000..eac86f1 --- /dev/null +++ b/previewgen.lua @@ -0,0 +1,85 @@ +local ie = ... + +local function generate_preview(building_def) + local catalog + local offset = {x=0, y=0, z=0} + local size + + if type(building_def.catalog) == "table" then + catalog = mapblock_lib.get_catalog(building_def.catalog.filename) + offset = building_def.catalog.offset or {x=0, y=0, z=0} + size = building_def.catalog.size or {x=1, y=1, z=1} + else + catalog = mapblock_lib.get_catalog(building_def.catalog) + size = catalog:get_size() + end + + local mb_pos2 = vector.add(offset, vector.subtract(size, 1)) + + local min = mapblock_lib.get_mapblock_bounds_from_mapblock(offset) + local _, max = mapblock_lib.get_mapblock_bounds_from_mapblock(mb_pos2) + + local png = isogen.draw(min, max, { + cube_len = 8, + get_node = function(pos) + return catalog:get_node(pos) + end + }) + + local filename = minetest.get_modpath(building_def.modname) .. + "/textures/" .. building_def.modname .. + "_preview_" .. building_def.name .. ".png" + + local f = ie.io.open(filename, "wb") + if not f then + return false, "could not open file: '" .. filename .. "'" + end + + f:write(png) + f:close() + + return true +end + +minetest.register_chatcommand("building_previewgen", { + params = "[modname]", + privs = { + mapblock_lib = true + }, + func = function(name, modname) + local buildings = building_lib.get_buildings() + local list = {} + for _, building in pairs(buildings) do + if building.modname == modname and building.placement == "mapblock_lib" then + table.insert(list, building) + end + end + + if #list == 0 then + return false, "no buildings found with given modname" + end + + local worker + worker = function() + local building = table.remove(list) + if not building then + minetest.chat_send_player(name, "Done generating previews") + return + end + + minetest.chat_send_player(name, "Generating preview for '" .. building.name .. "'") + local success, err = generate_preview(building) + if not success then + minetest.chat_send_player( + name, + "Preview generation failed for building: '" .. building.name .. "', error: " .. err + ) + else + minetest.after(0, worker) + end + end + + minetest.after(0, worker) + return true, "Scheduled " .. #list .. " buildings for preview-generation" + end +}) \ No newline at end of file