texgen/average_color.lua

19 lines
788 B
Lua

-- Average color, weighted by alpha and calculated in linear RGB colorspace
return function(png)
-- TODO make colorspecs extend vectors
local avg_color = modlib.vector.new{r = 0, g = 0, b = 0}
local total_alpha = 0
for _, color in ipairs(png.data) do
color = modlib.minetest.colorspec.from_number(color)
-- Squared average
avg_color = modlib.vector.add(avg_color, modlib.vector.multiply_scalar(
modlib.vector.pow_scalar({r = color.r, g = color.g, b = color.b}, 2), color.a))
total_alpha = total_alpha + color.a
end
if total_alpha == 0 then total_alpha = 1 end -- Avoid division by zero
-- Round & convert back to colorspec
avg_color = modlib.minetest.colorspec.new(avg_color:divide_scalar(total_alpha)
:apply(math.sqrt):add_scalar(0.5):floor())
return avg_color
end