2021-12-31 17:22:58 +01:00
extends Reference
2021-11-20 11:38:50 +01:00
class_name SummerDayCanvasState
signal fill_transform_changed ( fill_transform )
signal canvas_transform_changed ( canvas_transform )
signal view_transform_changed ( view_transform )
2021-12-05 11:21:58 +01:00
signal canvas_polygon_changed ( polygon )
2021-11-20 11:38:50 +01:00
var rect_size : Vector2
var fill_transform : = Transform2D . IDENTITY
2021-11-21 11:46:04 +01:00
var canvas_transform : = Transform2D . IDENTITY setget _set_canvas_transform
2021-12-04 13:47:14 +01:00
var view_transform : = Transform2D . IDENTITY # canvas_transform * fill_transform
2021-12-19 22:26:09 +01:00
var inverse_view_transform : = Transform2D . IDENTITY
2021-12-04 13:47:14 +01:00
2021-12-05 11:21:58 +01:00
# For spacial transform.
2021-12-04 13:47:14 +01:00
var clip_space_view_transform : = Transform2D . IDENTITY
var canvas_to_clip_space : = Transform2D . IDENTITY
2021-11-20 11:38:50 +01:00
2021-12-05 11:21:58 +01:00
var _canvas_polygon : PoolVector2Array # The polygon, that forms the canvas rect.
2021-11-20 11:38:50 +01:00
func _init ( ) :
connect ( " fill_transform_changed " , self , " _update_view_transformation " )
connect ( " canvas_transform_changed " , self , " _update_view_transformation " )
2022-01-01 12:55:02 +01:00
func update_fill_transform ( document : SummerDayDocument ) :
if document == null :
2021-11-20 11:38:50 +01:00
fill_transform = Transform2D . IDENTITY
else :
2022-01-01 12:55:02 +01:00
var aspect_ratio = document . resolution . x / document . resolution . y
2021-11-20 11:38:50 +01:00
var size_ratio = rect_size . x / rect_size . y
var scale
var translation = Vector2 . ZERO
if aspect_ratio < = size_ratio :
scale = rect_size . y
translation . x = rect_size . x * 0.5 - aspect_ratio * scale * 0.5
else :
scale = rect_size . x / aspect_ratio
translation . y = rect_size . y * 0.5 - scale * 0.5
fill_transform = Transform2D . IDENTITY . scaled ( Vector2 ( scale , scale ) )
fill_transform = fill_transform . translated ( translation )
fill_transform = Transform2D (
Vector2 ( scale , 0.0 ) ,
Vector2 ( 0.0 , scale ) ,
translation
)
2021-12-05 11:21:58 +01:00
2022-01-01 12:55:02 +01:00
_update_canvas_polygon ( document )
2021-12-05 11:21:58 +01:00
2021-11-20 11:38:50 +01:00
emit_signal ( " fill_transform_changed " , fill_transform )
2021-12-04 13:47:14 +01:00
func update_canvas_to_clip_space ( ) :
canvas_to_clip_space = Transform2D (
Vector2 ( 2.0 / rect_size . x , 0.0 ) ,
Vector2 ( 0.0 , - 2.0 / rect_size . y ) ,
Vector2 ( - 1.0 , 1.0 )
)
2021-11-20 11:38:50 +01:00
func _update_view_transformation ( transform ) :
2021-11-21 11:46:04 +01:00
view_transform = canvas_transform * fill_transform
2021-12-19 22:26:09 +01:00
inverse_view_transform = view_transform . affine_inverse ( )
2021-12-04 13:47:14 +01:00
clip_space_view_transform = canvas_to_clip_space * view_transform
2021-12-05 11:21:58 +01:00
emit_signal (
" view_transform_changed " , view_transform , clip_space_view_transform
)
2021-11-21 11:46:04 +01:00
func _set_canvas_transform ( new_canvas_transform ) :
canvas_transform = new_canvas_transform
emit_signal ( " canvas_transform_changed " , canvas_transform )
2021-12-05 11:21:58 +01:00
2022-01-01 12:55:02 +01:00
func _update_canvas_polygon ( document : SummerDayDocument ) :
if document == null :
2021-12-05 11:21:58 +01:00
_canvas_polygon = PoolVector2Array ( )
return
_canvas_polygon = PoolVector2Array (
[
Vector2 . ZERO ,
2022-01-01 12:55:02 +01:00
Vector2 ( document . raw_aspect_ratio , 0.0 ) ,
Vector2 ( document . raw_aspect_ratio , 1.0 ) ,
2021-12-05 11:21:58 +01:00
Vector2 ( 0.0 , 1.0 )
]
)
emit_signal ( " canvas_polygon_changed " , _canvas_polygon )