2022-01-01 12:55:02 +01:00
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 ( )
2022-01-01 13:18:55 +01:00
image . fill ( Color . red )
2022-01-01 12:55:02 +01:00
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 ]
)
2022-01-01 13:18:55 +01:00
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 )
2022-01-01 12:55:02 +01:00
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