Initial import
This commit is contained in:
commit
b49076eeed
|
@ -0,0 +1,265 @@
|
||||||
|
--[[
|
||||||
|
|
||||||
|
tga_testnodes – Minetest mod that adds nodes with TGA test images.
|
||||||
|
Copyright © 2023 Nils Dagsson Moskopp (erle)
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
Dieses Programm hat das Ziel, die Medienkompetenz der Leser zu
|
||||||
|
steigern. Gelegentlich packe ich sogar einen handfesten Buffer
|
||||||
|
Overflow oder eine Format String Vulnerability zwischen die anderen
|
||||||
|
Codezeilen und schreibe das auch nicht dran.
|
||||||
|
|
||||||
|
]]--
|
||||||
|
|
||||||
|
assert(
|
||||||
|
tga_encoder.features,
|
||||||
|
"No features table found. Install a newer version of tga_encoder!"
|
||||||
|
)
|
||||||
|
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
|
||||||
|
local S = minetest.get_translator( modname )
|
||||||
|
|
||||||
|
local textures_path = minetest.get_modpath( modname ) .. "/textures/"
|
||||||
|
|
||||||
|
local register_node = function(filename)
|
||||||
|
local prefix = filename:gmatch( "[^.]+" )():gsub( "-", "_" )
|
||||||
|
local nodename = modname .. ":" .. prefix
|
||||||
|
minetest.register_node(nodename, {
|
||||||
|
description = S(
|
||||||
|
"TGA Test Node " ..
|
||||||
|
prefix
|
||||||
|
),
|
||||||
|
drawtype = "glasslike",
|
||||||
|
groups = { dig_immediate = 2 },
|
||||||
|
paramtype = "light",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
tiles = { filename },
|
||||||
|
use_texture_alpha = "blend",
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local _ = { 0 }
|
||||||
|
local R = { 1 }
|
||||||
|
local G = { 2 }
|
||||||
|
local B = { 3 }
|
||||||
|
|
||||||
|
local pixels_colormapped_bt = {
|
||||||
|
{ _, _, _, _, _, B, _, B, },
|
||||||
|
{ _, _, _, _, _, B, B, B, },
|
||||||
|
{ _, _, G, G, G, B, _, B, },
|
||||||
|
{ _, _, G, _, G, B, B, B, },
|
||||||
|
{ _, R, G, _, _, _, _, _, },
|
||||||
|
{ _, R, G, G, G, _, _, _, },
|
||||||
|
{ _, R, _, _, _, _, _, _, },
|
||||||
|
{ R, R, R, _, _, _, _, _, },
|
||||||
|
}
|
||||||
|
|
||||||
|
local pixels_colormapped_tb = {
|
||||||
|
{ R, R, R, _, _, _, _, _, },
|
||||||
|
{ _, R, _, _, _, _, _, _, },
|
||||||
|
{ _, R, G, G, G, _, _, _, },
|
||||||
|
{ _, R, G, _, _, _, _, _, },
|
||||||
|
{ _, _, G, _, G, B, B, B, },
|
||||||
|
{ _, _, G, G, G, B, _, B, },
|
||||||
|
{ _, _, _, _, _, B, B, B, },
|
||||||
|
{ _, _, _, _, _, B, _, B, },
|
||||||
|
}
|
||||||
|
|
||||||
|
local pixels_colormapped_by_scanline_order = {
|
||||||
|
["bottom_top"] = pixels_colormapped_bt,
|
||||||
|
["top_bottom"] = pixels_colormapped_tb,
|
||||||
|
}
|
||||||
|
|
||||||
|
local colormap_32bpp = {
|
||||||
|
{ 0, 0, 0, 127 },
|
||||||
|
{ 255, 0, 0, 255 },
|
||||||
|
{ 0, 255, 0, 255 },
|
||||||
|
{ 0, 0, 255, 255 },
|
||||||
|
}
|
||||||
|
|
||||||
|
local colormap_24bpp = {
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
{ 255, 0, 0 },
|
||||||
|
{ 0, 255, 0 },
|
||||||
|
{ 0, 0, 255 },
|
||||||
|
}
|
||||||
|
|
||||||
|
local colormap_16bpp = {
|
||||||
|
{ 0, 0, 0, 0 },
|
||||||
|
{ 255, 0, 0, 255 },
|
||||||
|
{ 0, 255, 0, 255 },
|
||||||
|
{ 0, 0, 255, 255 },
|
||||||
|
}
|
||||||
|
|
||||||
|
local colormap_by_color_format = {
|
||||||
|
["A1R5G5B5"] = colormap_16bpp,
|
||||||
|
["B8G8R8"] = colormap_24bpp,
|
||||||
|
["B8G8R8A8"] = colormap_32bpp,
|
||||||
|
}
|
||||||
|
|
||||||
|
for color_format, _ in pairs(
|
||||||
|
tga_encoder.features.color_format
|
||||||
|
) do
|
||||||
|
if ("Y8" ~= color_format) then
|
||||||
|
for scanline_order, _ in pairs(
|
||||||
|
tga_encoder.features.scanline_order
|
||||||
|
) do
|
||||||
|
local filename
|
||||||
|
local pixels
|
||||||
|
filename = "type1" ..
|
||||||
|
'-' .. color_format ..
|
||||||
|
'-' .. scanline_order ..
|
||||||
|
'.tga'
|
||||||
|
pixels = pixels_colormapped_by_scanline_order[
|
||||||
|
scanline_order
|
||||||
|
]
|
||||||
|
local colormap = colormap_by_color_format[
|
||||||
|
color_format
|
||||||
|
]
|
||||||
|
local properties = {
|
||||||
|
colormap = colormap,
|
||||||
|
color_format = color_format,
|
||||||
|
scanline_order = scanline_order,
|
||||||
|
}
|
||||||
|
print(filename)
|
||||||
|
local image = tga_encoder.image(pixels)
|
||||||
|
image:save(
|
||||||
|
textures_path .. filename,
|
||||||
|
properties
|
||||||
|
)
|
||||||
|
register_node(filename)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local _ = { 0, 0, 0, 127 }
|
||||||
|
local R = { 255, 0, 0, 255 }
|
||||||
|
local G = { 0, 255, 0, 255 }
|
||||||
|
local B = { 0, 0, 255, 255 }
|
||||||
|
|
||||||
|
local pixels_rgba_bt = {
|
||||||
|
{ _, _, _, _, _, B, _, B, },
|
||||||
|
{ _, _, _, _, _, B, B, B, },
|
||||||
|
{ _, _, G, G, G, B, _, B, },
|
||||||
|
{ _, _, G, _, G, B, B, B, },
|
||||||
|
{ _, R, G, _, _, _, _, _, },
|
||||||
|
{ _, R, G, G, G, _, _, _, },
|
||||||
|
{ _, R, _, _, _, _, _, _, },
|
||||||
|
{ R, R, R, _, _, _, _, _, },
|
||||||
|
}
|
||||||
|
|
||||||
|
local pixels_rgba_tb = {
|
||||||
|
{ R, R, R, _, _, _, _, _, },
|
||||||
|
{ _, R, _, _, _, _, _, _, },
|
||||||
|
{ _, R, G, G, G, _, _, _, },
|
||||||
|
{ _, R, G, _, _, _, _, _, },
|
||||||
|
{ _, _, G, _, G, B, B, B, },
|
||||||
|
{ _, _, G, G, G, B, _, B, },
|
||||||
|
{ _, _, _, _, _, B, B, B, },
|
||||||
|
{ _, _, _, _, _, B, _, B, },
|
||||||
|
}
|
||||||
|
|
||||||
|
local pixels_rgba_by_scanline_order = {
|
||||||
|
["bottom_top"] = pixels_rgba_bt,
|
||||||
|
["top_bottom"] = pixels_rgba_tb,
|
||||||
|
}
|
||||||
|
|
||||||
|
local _ = { 0, 0, 0 }
|
||||||
|
local R = { 255, 0, 0 }
|
||||||
|
local G = { 0, 255, 0 }
|
||||||
|
local B = { 0, 0, 255 }
|
||||||
|
|
||||||
|
local pixels_rgb_bt = {
|
||||||
|
{ _, _, _, _, _, B, _, B, },
|
||||||
|
{ _, _, _, _, _, B, B, B, },
|
||||||
|
{ _, _, G, G, G, B, _, B, },
|
||||||
|
{ _, _, G, _, G, B, B, B, },
|
||||||
|
{ _, R, G, _, _, _, _, _, },
|
||||||
|
{ _, R, G, G, G, _, _, _, },
|
||||||
|
{ _, R, _, _, _, _, _, _, },
|
||||||
|
{ R, R, R, _, _, _, _, _, },
|
||||||
|
}
|
||||||
|
|
||||||
|
local pixels_rgb_tb = {
|
||||||
|
{ R, R, R, _, _, _, _, _, },
|
||||||
|
{ _, R, _, _, _, _, _, _, },
|
||||||
|
{ _, R, G, G, G, _, _, _, },
|
||||||
|
{ _, R, G, _, _, _, _, _, },
|
||||||
|
{ _, _, G, _, G, B, B, B, },
|
||||||
|
{ _, _, G, G, G, B, _, B, },
|
||||||
|
{ _, _, _, _, _, B, B, B, },
|
||||||
|
{ _, _, _, _, _, B, _, B, },
|
||||||
|
}
|
||||||
|
|
||||||
|
local pixels_rgb_by_scanline_order = {
|
||||||
|
["bottom_top"] = pixels_rgb_bt,
|
||||||
|
["top_bottom"] = pixels_rgb_tb,
|
||||||
|
}
|
||||||
|
|
||||||
|
local tga_type_by_compression = {
|
||||||
|
["RAW"] = "2",
|
||||||
|
["RLE"] = "10",
|
||||||
|
}
|
||||||
|
|
||||||
|
local pixels_by_scanline_order_by_color_format = {
|
||||||
|
["A1R5G5B5"] = pixels_rgba_by_scanline_order,
|
||||||
|
["B8G8R8"] = pixels_rgb_by_scanline_order,
|
||||||
|
["B8G8R8A8"] = pixels_rgba_by_scanline_order,
|
||||||
|
["Y8"] = pixels_rgb_by_scanline_order,
|
||||||
|
}
|
||||||
|
|
||||||
|
for color_format, _ in pairs(
|
||||||
|
tga_encoder.features.color_format
|
||||||
|
) do
|
||||||
|
local pixels_by_scanline_order = pixels_by_scanline_order_by_color_format[
|
||||||
|
color_format
|
||||||
|
]
|
||||||
|
for compression, _ in pairs(
|
||||||
|
tga_encoder.features.compression
|
||||||
|
) do
|
||||||
|
local tga_type
|
||||||
|
if (
|
||||||
|
"Y8" == color_format and
|
||||||
|
"RAW" == compression
|
||||||
|
) then
|
||||||
|
tga_type = "3"
|
||||||
|
else
|
||||||
|
tga_type = tga_type_by_compression[
|
||||||
|
compression
|
||||||
|
]
|
||||||
|
end
|
||||||
|
-- tga_encoder can not encode grayscale RLE (type 11)
|
||||||
|
if not(
|
||||||
|
"Y8" == color_format and
|
||||||
|
"RLE" == compression
|
||||||
|
) then
|
||||||
|
for scanline_order, _ in pairs(
|
||||||
|
tga_encoder.features.scanline_order
|
||||||
|
) do
|
||||||
|
local filename = "type" .. tga_type ..
|
||||||
|
'-' .. color_format ..
|
||||||
|
'-' .. scanline_order ..
|
||||||
|
'.tga'
|
||||||
|
local pixels = pixels_by_scanline_order[
|
||||||
|
scanline_order
|
||||||
|
]
|
||||||
|
local properties = {
|
||||||
|
color_format = color_format,
|
||||||
|
compression = compression,
|
||||||
|
scanline_order = scanline_order,
|
||||||
|
}
|
||||||
|
local image = tga_encoder.image(pixels)
|
||||||
|
image:save(
|
||||||
|
textures_path .. filename,
|
||||||
|
properties
|
||||||
|
)
|
||||||
|
register_node(filename)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue