From 9dea792ca8cbbcc21a71d053efda6ff88e711de4 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Thu, 19 May 2022 03:19:25 +0200 Subject: [PATCH] Refactor map icon blitting --- init.lua | 106 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 41 deletions(-) diff --git a/init.lua b/init.lua index bc0eea7..ad6617f 100644 --- a/init.lua +++ b/init.lua @@ -15,6 +15,37 @@ Codezeilen und schreibe das auch nicht dran. ]]-- +-- blit an icon into the image unless its rect overlaps pixels that +-- have any of the stop_colors, treating a nil pixel as transparent +function tga_encoder.image:blit_icon(icon, pos, stop_colors) + local x = pos.x + local z = pos.z + local overlap = false + for i_z = 1,#icon do + for i_x = 1,#icon[i_z] do + local color = self.pixels[z + i_z][x + i_x][1] + if stop_colors[color] then + overlap = true + break + end + end + if overlap then + break + end + end + if overlap then + return + end + for i_z = 1,#icon do + for i_x = 1,#icon[i_z] do + local color = icon[i_z][i_x][1] + if color then + self.pixels[z + i_z][x + i_x] = { color } + end + end + end +end + maps = {} maps.dots = {} maps.maps = {} @@ -134,6 +165,8 @@ maps.create_map = function(pos, player_name) end end + local image = tga_encoder.image(pixels) + local positions = minetest.find_nodes_in_area_under_air( minp, maxp, @@ -161,58 +194,49 @@ maps.create_map = function(pos, player_name) ) if draw_tree then local tree = {} + local _ = { nil } -- transparent + local O = { 7 } -- outline + local F = { 8 } -- filling if nil ~= node.name:find("pine") then tree = { - " # ", - "#####", - "#...#", - " #.# ", - " #.# ", - " # ", + { _, _, O, _, _ }, + { O, O, O, O, O }, + { O, F, F, F, O }, + { _, O, F, O, _ }, + { _, O, F, O, _ }, + { _, _, O, _, _ }, } else tree = { - " # ", - " # ", - " ### ", - "#...#", - "#...#", - "#...#", - " ### ", + { _, _, O, _, _ }, + { _, _, O, _, _ }, + { _, O, O, O, _ }, + { O, F, F, F, O }, + { O, F, F, F, O }, + { O, F, F, F, O }, + { _, O, O, O, _ }, } end - local overlap = false - for t_z = 1,#tree do - for t_x = 1,#tree[t_z] do - local color = pixels[z + t_z][x + t_x - 3][1] - -- do not draw trees close to trees or water - if color > 2 then - overlap = true - break - end - end - if overlap then - break - end - end - if overlap then - tree = {} - end - for t_z = 1,#tree do - for t_x = 1,#tree[t_z] do - local byte = tree[t_z]:byte(t_x) - if 35 == byte then -- # - pixels[z + t_z][x + t_x - 3] = { 7 } - elseif 46 == byte then -- . - pixels[z + t_z][x + t_x - 3] = { 8 } - end - end - end + image:blit_icon( + tree, + { + x = x - 3, + z = z + }, + { + [3] = true, + [4] = true, + [5] = true, + [6] = true, + [7] = true, + [8] = true + } + ) end end local filepath = textures_dir .. filename - tga_encoder.image(pixels):save( + image:save( filepath, { colormap=colormap } )