SummerDay/addons/summer_day/data/document/table.gd

62 lines
1.3 KiB
GDScript

tool
extends Resource
class_name SummerDayTable
export(int) var allocation_size # How many matrices per frame.
export(ImageTexture) var texture
export(Image) var image
var dirty_flag = false
func create():
var row_size = allocation_size * 4
image.create(row_size, 1, false, Image.FORMAT_RGBAF)
texture.create_from_image(image, 0)
_presage_changes()
image.fill(Color.red)
flush()
# Position in matrix-indices, not in pixels.
func apply_matrix(matrix: SummerDayMatrix4, row: int, position: int):
_presage_changes()
var color_list = matrix.get_values_as_colors()
for i in range(4):
image.set_pixel(
position * 4 + i,
row, color_list[i]
)
func add_row():
_presage_changes()
image.crop(image.get_width(), image.get_height() + 1)
func remove_row(at: int):
_presage_changes()
var size = image.get_size()
var below_height = size.y - 1
if at < below_height:
image.blit_rect(image,
Rect2(Vector2(0, at + 1), Vector2(size.x, below_height - at)),
Vector2(Vector2(0, at))
)
image.crop(size.x, below_height)
func flush():
if dirty_flag:
image.unlock()
texture.set_data(image)
dirty_flag = false
# This needs to be called before anything, that makes changes to the image!
func _presage_changes():
if !dirty_flag:
image.lock()
dirty_flag = true