utilities_gamedev/tile_generator/smple_tile.gd

129 lines
2.6 KiB
GDScript

tool
extends Resource
export(Texture) var input : Texture
export(String) var output_image_name : String = "output"
export(int) var image_count : int = 1
export(int) var image_size_x : int = 64
export(int) var image_size_y : int = 32
export(bool) var alpha_crop : bool = true
export(bool) var generate : bool = false setget set_generate, get_generate
#from mat_maker_gd
static func rotate(uv : Vector2, center : Vector2, rotate : float) -> Vector2:
var rv : Vector2 = Vector2()
uv -= center
rv.x = cos(rotate)*uv.x + sin(rotate)*uv.y
rv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y
rv += center
return rv
#from mat_maker_gd
static func scale(uv : Vector2, center : Vector2, scale : Vector2) -> Vector2:
uv -= center
uv /= scale
uv += center
return uv
func generate():
if !input:
return
var inimg : Image = input.get_data()
var img : Image = null
if image_count > 1:
pass
else:
img = Image.new()
img.create(inimg.get_width() * 3, inimg.get_height() * 3, false, Image.FORMAT_RGBA8)
var ofsx : int = inimg.get_width()
var ofsy : int = inimg.get_height()
img.lock()
inimg.lock()
for x in range(inimg.get_width()):
for y in range(inimg.get_height()):
var np : Vector2 = rotate(Vector2(x, y), Vector2(x / 2, y / 2), deg2rad(90))
np += Vector2(ofsx, ofsy)
var c : Color = inimg.get_pixel(x, y)
img.set_pixel(np.x, np.y, c)
img.unlock()
inimg.unlock()
img = crop_image(img)
img.resize(image_size_x, image_size_y, Image.INTERPOLATE_CUBIC)
if alpha_crop:
alpha_crop(img)
img.save_png(resource_path.get_base_dir() + "/" + output_image_name + ".png")
func alpha_crop(img : Image) -> void:
img.lock()
for x in range(img.get_width()):
for y in range(img.get_height()):
var c : Color = img.get_pixel(x, y)
if c.a < 0.5:
img.set_pixel(x, y, Color(0, 0, 0, 0))
elif c.a < 1:
c.a = 1
img.set_pixel(x, y, c)
img.unlock()
func crop_image(img : Image) -> Image:
img.lock()
var xmin : int = img.get_width() + 1
var xmax : int = 0
var ymin : int = img.get_height() + 1
var ymax : int = 0
for x in range(img.get_width()):
for y in range(img.get_height()):
var c : Color = img.get_pixel(x, y)
if c.a < 0.02:
continue
if xmin > x:
xmin = x
if xmax < x:
xmax = x
if ymin > y:
ymin = y
if ymax < y:
ymax = y
img.unlock()
var w : int = xmax - xmin
var h : int = ymax - ymin
var rimg : Image = Image.new()
rimg.create(w, h, false, Image.FORMAT_RGBA8)
rimg.blit_rect(img, Rect2(xmin, ymin, w, h), Vector2())
return rimg
func set_generate(val):
if val:
generate()
func get_generate():
return false