GraphicsEditor/addons/graphics_editor/PaintCanvas.gd

183 lines
5.7 KiB
GDScript3
Raw Normal View History

2019-08-04 09:57:42 +02:00
tool
extends Control
2019-11-23 12:33:43 +01:00
export var grid_size = 16 setget resize_grid
export var canvas_size = Vector2(100, 100) setget resize_canvas
export var chunk_size = Vector2(10, 10)
2019-08-04 09:57:42 +02:00
export var can_draw = true
2019-11-23 12:33:43 +01:00
onready var canvas_node = get_node("CanvasImage")
onready var util = get_node("Util")
2019-08-04 09:57:42 +02:00
var mouse_in_region
2019-11-23 12:33:43 +01:00
var last_pixel_drawn = []
var image = Image.new()
var image_render = Image.new()
var image_texture = ImageTexture.new()
signal grid_resized
signal canvas_resized
2019-08-04 09:57:42 +02:00
func _ready():
2019-11-23 12:33:43 +01:00
image.create(canvas_size.x, canvas_size.y, true, Image.FORMAT_RGBA8)
image_render.create(canvas_size.x, canvas_size.y, true, Image.FORMAT_RGBA8)
rect_min_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
rect_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
canvas_node.rect_min_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
canvas_node.rect_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
image.lock()
image_render.lock()
2019-08-04 09:57:42 +02:00
func _process(delta):
2019-11-23 12:33:43 +01:00
update_canvas()
#----------------------
#---SETGET FUNCTIONS---
#----------------------
func resize_grid(new_size):
grid_size = new_size
if canvas_node:
#generate_chunks()
rect_min_size = Vector2(canvas_size.x * new_size, canvas_size.y * new_size)
rect_size = Vector2(canvas_size.x * new_size, canvas_size.y * new_size)
canvas_node.rect_min_size = Vector2(canvas_size.x * new_size, canvas_size.y * new_size)
canvas_node.rect_size = Vector2(canvas_size.x * new_size, canvas_size.y * new_size)
emit_signal("grid_resized", new_size)
func resize_canvas(new_size):
canvas_size = new_size
if canvas_node:
image.unlock()
image = Image.new()
image.create(canvas_size.x, canvas_size.y, true, Image.FORMAT_RGBA8)
image.lock()
image_render.unlock()
image_render.create(canvas_size.x, canvas_size.y, true, Image.FORMAT_RGBA8)
image_render.lock()
rect_min_size = Vector2(new_size.x * grid_size, new_size.y * grid_size)
rect_size = Vector2(new_size.x * grid_size, new_size.y * grid_size)
canvas_node.rect_min_size = Vector2(new_size.x * grid_size, new_size.y * grid_size)
canvas_node.rect_size = Vector2(new_size.x * grid_size, new_size.y * grid_size)
emit_signal("canvas_resized", new_size)
#---------------------
#---CHUNK FUNCTIONS---
#---------------------
func spawn_chunk(pos):
pass
func update_chunk(pos):
pass
func get_chunk_from_pixel(pos):
pass
func set_chunk(pos):
pass
func remove_chunk(pos):
pass
2019-08-04 09:57:42 +02:00
func generate_chunks():
2019-11-23 12:33:43 +01:00
pass
2019-08-04 09:57:42 +02:00
2019-11-23 12:33:43 +01:00
#---------------------
#---PIXEL FUNCTIONS---
#---------------------
2019-08-04 09:57:42 +02:00
2019-11-23 12:33:43 +01:00
func get_pixel(pos):
if not pixel_in_canvas_region(pos):
2019-08-04 09:57:42 +02:00
return null
2019-11-23 12:33:43 +01:00
return image.get_pixelv(pos)
2019-08-04 09:57:42 +02:00
2019-11-23 12:33:43 +01:00
func set_pixel(pos, color):
if not pixel_in_canvas_region(pos):
return null
2019-08-04 09:57:42 +02:00
2019-11-23 12:33:43 +01:00
last_pixel_drawn = [pos, color]
return image.set_pixelv(pos, color)
2019-11-23 12:33:43 +01:00
func pixel_in_canvas_region(pos):
if pos.x < canvas_size.x and pos.x > -1 and pos.y < canvas_size.y and pos.y > -1:
2019-08-04 09:57:42 +02:00
return true
2019-11-23 12:33:43 +01:00
return false
#--------------------
#--Canvas Rendering--
#--------------------
var image_pixel_array = []
func update_canvas():
image_render.fill(Color(0, 0, 0, 0))
for i in image_pixel_array:
image_render.blend_rect(i, Rect2(Vector2.ZERO, canvas_size), Vector2.ZERO)
image_texture.create_from_image(image_render)
image_texture.set_flags(0)
if canvas_node:
canvas_node.texture = image_texture
#---------------------
#---IMAGE FUNCTIONS---
#---------------------
func load_image(image_data):
var array_data = image_data_to_array(image_data)
image.unlock()
image.create(canvas_size.x, canvas_size.y, true, Image.FORMAT_RGBA8)
image.lock()
image_render.unlock()
image_render.create(canvas_size.x, canvas_size.y, true, Image.FORMAT_RGBA8)
image_render.lock()
set_pixels_from_array(array_data)
rect_min_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
rect_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
canvas_node.rect_min_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
canvas_node.rect_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
emit_signal("canvas_resized", canvas_size)
func load_image_from_file(file_path):
image.unlock()
image.load(file_path)
image.lock()
canvas_size = image.get_size()
image_render.unlock()
image_render.create(canvas_size.x, canvas_size.y, true, Image.FORMAT_RGBA8)
image_render.lock()
rect_min_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
rect_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
canvas_node.rect_min_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
canvas_node.rect_size = Vector2(canvas_size.x * grid_size, canvas_size.y * grid_size)
emit_signal("canvas_resized", canvas_size)
func expand_canvas(new_size):
canvas_size = new_size
if canvas_node:
var array_data = image_data_to_array(image)
image.unlock()
image.create(new_size.x, new_size.y, true, Image.FORMAT_RGBA8)
image.lock()
image_render.unlock()
image_render.create(new_size.x, new_size.y, true, Image.FORMAT_RGBA8)
image_render.lock()
set_pixels_from_array(array_data)
rect_min_size = Vector2(new_size.x * grid_size, new_size.y * grid_size)
rect_size = Vector2(new_size.x * grid_size, new_size.y * grid_size)
canvas_node.rect_min_size = Vector2(new_size.x * grid_size, new_size.y * grid_size)
canvas_node.rect_size = Vector2(new_size.x * grid_size, new_size.y * grid_size)
emit_signal("canvas_resized", new_size)
func set_pixels_from_array(array):
for i in array:
set_pixel(i[0], i[1])
func image_data_to_array(image_data):
var array = []
if image_data:
image_data.lock()
var image_data_size = image_data.get_size()
for x in image_data_size.x:
for y in image_data_size.y:
array.append([Vector2(x, y), image_data.get_pixel(x, y)])
return array