Seperated canvas and canvas_state for better tool implementation.

This commit is contained in:
Mono 2021-11-20 11:38:50 +01:00
parent 3fc488996f
commit 9814051fc4
10 changed files with 140 additions and 78 deletions

View File

@ -4,4 +4,4 @@
[resource]
script = ExtResource( 1 )
aspect_ratio = Vector2( 16, 9 )
aspect_ratio = Vector2( 20.169, 14.308 )

View File

@ -2,21 +2,12 @@ tool
extends Control
class_name SummerDayCanvas
signal fill_transform_changed(fill_transform)
signal canvas_transform_changed(canvas_transform)
signal view_transform_changed(view_transform)
var scene: SummerDayScene
var fill_transform := Transform2D.IDENTITY
var canvas_transform := Transform2D.IDENTITY
var view_transform := Transform2D.IDENTITY # fill_transform * canvas_transform
var canvas_state := SummerDayCanvasState.new()
func _ready():
connect("view_transform_changed",
canvas_state.connect("view_transform_changed",
$BackgroundLayer/EmptyCanvasLayer, "_on_view_transform_changed")
@ -29,53 +20,17 @@ func _gui_input(event):
func _on_SummerDay_scene_changed(new_scene):
scene = new_scene
_update_fill_transform()
canvas_state.update_fill_transform(scene)
scene.connect("aspect_ratio_changed",
self, "_on_scene_aspect_ratio_changed")
$Label.text = str(scene) + "\n" + str(scene.aspect_ratio)
func _on_Canvas_resized():
_update_fill_transform()
canvas_state.rect_size = rect_size
canvas_state.update_fill_transform(scene)
func _on_scene_aspect_ratio_changed(new_aspect_ratio):
$BackgroundLayer/EmptyCanvasLayer._update_size(new_aspect_ratio)
_update_fill_transform()
func _update_fill_transform():
if scene == null:
fill_transform = Transform2D.IDENTITY
else:
var aspect_ratio = scene.aspect_ratio.x / scene.aspect_ratio.y
var size_ratio = rect_size.x / rect_size.y
var scale
var translation = Vector2.ZERO
if aspect_ratio <= size_ratio:
scale = rect_size.y
print(rect_size.y)
translation.x = rect_size.x * 0.5 - aspect_ratio * scale * 0.5
print(rect_size.x * 0.5)
print(aspect_ratio * scale * 0.5)
print(translation)
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
)
print(fill_transform)
emit_signal("fill_transform_changed", fill_transform)
func _update_view_transformation(transform):
view_transform = fill_transform * canvas_transform
emit_signal("view_transform_changed", view_transform)
$BackgroundLayer/EmptyCanvasLayer.update_size(scene)
canvas_state.update_fill_transform(scene)

View File

@ -2,7 +2,7 @@
[ext_resource path="res://addons/summer_day/tool/canvas/canvas.gd" type="Script" id=1]
[ext_resource path="res://Main.tscn" type="PackedScene" id=2]
[ext_resource path="res://addons/summer_day/tool/canvas/empty_canvas_layer.gd" type="Script" id=3]
[ext_resource path="res://addons/summer_day/tool/canvas/rendering/empty_canvas_layer.gd" type="Script" id=3]
[sub_resource type="Environment" id=1]
ambient_light_color = Color( 1, 1, 1, 1 )
@ -74,6 +74,4 @@ script = SubResource( 3 )
margin_right = 40.0
margin_bottom = 14.0
[connection signal="canvas_transform_changed" from="." to="." method="_update_view_transformation"]
[connection signal="fill_transform_changed" from="." to="." method="_update_view_transformation"]
[connection signal="resized" from="." to="." method="_on_Canvas_resized"]

View File

@ -0,0 +1,55 @@
extends Resource
class_name SummerDayCanvasState
signal fill_transform_changed(fill_transform)
signal canvas_transform_changed(canvas_transform)
signal view_transform_changed(view_transform)
var rect_size: Vector2
var fill_transform := Transform2D.IDENTITY
var canvas_transform := Transform2D.IDENTITY
var view_transform := Transform2D.IDENTITY # fill_transform * canvas_transform
func _init():
connect("fill_transform_changed", self, "_update_view_transformation")
connect("canvas_transform_changed", self, "_update_view_transformation")
func update_fill_transform(scene):
if scene == null:
fill_transform = Transform2D.IDENTITY
else:
var aspect_ratio = scene.aspect_ratio.x / scene.aspect_ratio.y
var size_ratio = rect_size.x / rect_size.y
var scale
var translation = Vector2.ZERO
if aspect_ratio <= size_ratio:
scale = rect_size.y
print(rect_size.y)
translation.x = rect_size.x * 0.5 - aspect_ratio * scale * 0.5
print(rect_size.x * 0.5)
print(aspect_ratio * scale * 0.5)
print(translation)
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
)
print(fill_transform)
emit_signal("fill_transform_changed", fill_transform)
func _update_view_transformation(transform):
print("DoWeReach?")
view_transform = fill_transform * canvas_transform
emit_signal("view_transform_changed", view_transform)

View File

@ -1,22 +0,0 @@
tool
extends Polygon2D
func _ready():
pass
func _update_size(new_aspect_ratio):
print("We got here")
var calculated_aspect_ratio = new_aspect_ratio.x / new_aspect_ratio.y
polygon = PoolVector2Array(
[
Vector2.ZERO,
Vector2(calculated_aspect_ratio, 0.0),
Vector2(calculated_aspect_ratio, 1.0),
Vector2(0.0, 1.0)
]
)
func _on_view_transform_changed(new_view_transform):
transform = new_view_transform

View File

@ -0,0 +1,23 @@
tool
extends Polygon2D
func _ready():
pass
func update_size(scene: SummerDayScene):
if scene == null:
polygon = PoolVector2Array()
return
polygon = PoolVector2Array(
[
Vector2.ZERO,
Vector2(scene.raw_aspect_ratio, 0.0),
Vector2(scene.raw_aspect_ratio, 1.0),
Vector2(0.0, 1.0)
]
)
func _on_view_transform_changed(new_view_transform):
transform = new_view_transform

View File

@ -0,0 +1,10 @@
extends Reference
class_name SummerDayBaseTool
func _check_if_chosen(input) -> int: # Virtual.
return 0
func _run(tool_context): # Virtual.
pass

View File

@ -0,0 +1,4 @@
extends SummerDayBaseTool
class_name SummerDayHandTool

View File

@ -0,0 +1,15 @@
extends Reference
class_name SummerDayToolContext
var edited_scene: SummerDayScene
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

View File

@ -44,11 +44,26 @@ _global_script_classes=[ {
"language": "GDScript",
"path": "res://Bullshit/ScriptEditTest.gd"
}, {
"base": "Reference",
"class": "SummerDayBaseTool",
"language": "GDScript",
"path": "res://addons/summer_day/tool/canvas/tool_system/base_tool.gd"
}, {
"base": "Control",
"class": "SummerDayCanvas",
"language": "GDScript",
"path": "res://addons/summer_day/tool/canvas/canvas.gd"
}, {
"base": "Resource",
"class": "SummerDayCanvasState",
"language": "GDScript",
"path": "res://addons/summer_day/tool/canvas/canvas_state.gd"
}, {
"base": "SummerDayBaseTool",
"class": "SummerDayHandTool",
"language": "GDScript",
"path": "res://addons/summer_day/tool/canvas/tool_system/general_use/hand.gd"
}, {
"base": "Control",
"class": "SummerDayMainScreen",
"language": "GDScript",
@ -64,6 +79,11 @@ _global_script_classes=[ {
"language": "GDScript",
"path": "res://addons/summer_day/tool/timeline/timeline.gd"
}, {
"base": "Reference",
"class": "SummerDayToolContext",
"language": "GDScript",
"path": "res://addons/summer_day/tool/canvas/tool_system/tool_context.gd"
}, {
"base": "OH",
"class": "VeryWorse",
"language": "GDScript",
@ -77,10 +97,14 @@ _global_script_class_icons={
"PremiumTexture": "",
"SDDisplay": "",
"ScriptEditorTest": "",
"SummerDayBaseTool": "",
"SummerDayCanvas": "",
"SummerDayCanvasState": "",
"SummerDayHandTool": "",
"SummerDayMainScreen": "",
"SummerDayScene": "",
"SummerDayTimeline": "",
"SummerDayToolContext": "",
"VeryWorse": ""
}