From 68d8e00922f9720fc0ed61c49d0ff24771a953e7 Mon Sep 17 00:00:00 2001 From: Mono Date: Sat, 4 Dec 2021 13:47:14 +0100 Subject: [PATCH] Added view_transform for spatial space. --- Main.tscn | 49 ++++++++++++------- addons/summer_day/main_screen.gd | 5 ++ addons/summer_day/tool/canvas/canvas.gd | 19 ++++++- addons/summer_day/tool/canvas/canvas_state.gd | 21 +++++++- .../tool/canvas/rendering/space_camera.gd | 25 ++++++++++ .../summer_day/tool/tool_system/base_tool.gd | 1 - 6 files changed, 99 insertions(+), 21 deletions(-) create mode 100644 addons/summer_day/tool/canvas/rendering/space_camera.gd diff --git a/Main.tscn b/Main.tscn index 65efc02..a828144 100644 --- a/Main.tscn +++ b/Main.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=17 format=2] +[gd_scene load_steps=20 format=2] [ext_resource path="res://TryingOutSomethingNew.gd" type="Script" id=1] [ext_resource path="res://Node2D.gd" type="Script" id=2] [ext_resource path="res://icon.png" type="Texture" id=3] [ext_resource path="res://addons/summer_day/interface/display.gd" type="Script" id=4] [ext_resource path="res://Bullshit/Main.gd" type="Script" id=5] +[ext_resource path="res://addons/summer_day/tool/canvas/rendering/space_camera.gd" type="Script" id=6] [sub_resource type="Shader" id=1] code = "shader_type spatial; @@ -37,7 +38,7 @@ shader = SubResource( 1 ) shader_param/albedo = Color( 0.768627, 0.231373, 0.231373, 1 ) shader_param/ha = null -[sub_resource type="Image" id=15] +[sub_resource type="Image" id=20] data = { "data": PoolByteArray( 0, 0, 128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 154, 153, 25, 62, 0, 0, 0, 0, 0, 0, 128, 62, 0, 0, 0, 0, 154, 153, 25, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 154, 153, 25, 190, 0, 0, 0, 0, 0, 0, 128, 62, 0, 0, 0, 0, 154, 153, 25, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63 ), "format": "RGBAFloat", @@ -49,7 +50,7 @@ data = { [sub_resource type="ImageTexture" id=16] flags = 0 flags = 0 -image = SubResource( 15 ) +image = SubResource( 20 ) size = Vector2( 8, 1 ) [sub_resource type="CapsuleMesh" id=5] @@ -63,6 +64,7 @@ code = "shader_type spatial; render_mode blend_mix,depth_draw_opaque,cull_disabled,skip_vertex_transform; +uniform mat3 canvas_transform; uniform sampler2D table : hint_albedo; @@ -82,34 +84,46 @@ void vertex() { row1 = vec4(indx(1).x, indx(1).y, indx(1).z, indx(1).w); row2 = vec4(indx(2).x, indx(2).y, indx(2).z, indx(2).w); row3 = vec4(indx(3).x, indx(3).y, indx(3).z, indx(3).w); -// row0 = vec4(0.1, 0.0, 0.0, 0.0); -// row1 = vec4(0.0, 0.1, 0.0, 0.0); -// row2 = vec4(0.0, 0.0, 0.1, 0.0); -// row3 = vec4(0.0, 0.0, 0.0, 1.0); } else { row0 = vec4(indx(4).x, indx(4).y, indx(4).z, indx(4).w); row1 = vec4(indx(5).x, indx(5).y, indx(5).z, indx(5).w); row2 = vec4(indx(6).x, indx(6).y, indx(6).z, indx(6).w); row3 = vec4(indx(7).x, indx(7).y, indx(7).z, indx(7).w); -// row0 = vec4(0.1, 0.0, 0.0, 0.0); -// row1 = vec4(0.0, 0.1, 0.0, 0.0); -// row2 = vec4(0.0, 0.0, 0.1, 0.0); -// row3 = vec4(0.0, 0.0, 0.0, 1.0); } mat4 crank_matrix = mat4(row0, row1, row2, row3); + + vec4 pre = vec4(VERTEX, 1.0) * crank_matrix; - POSITION = pre; - VERTEX = (pre / pre.w).xyz; + vec3 transformed_xy = vec3(pre.xy, 1.0) * transpose(canvas_transform); + vec4 post = vec4(transformed_xy.x, transformed_xy.y, pre.z, pre.w); + POSITION = post; + VERTEX = (post / post.w).xyz; } void fragment() { ALBEDO = texture(table, UV).rgb; }" +[sub_resource type="Image" id=21] +data = { +"data": PoolByteArray( 0, 0, 128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 154, 153, 25, 62, 0, 0, 0, 0, 0, 0, 128, 62, 0, 0, 0, 0, 154, 153, 25, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 154, 153, 25, 190, 0, 0, 0, 0, 0, 0, 128, 62, 0, 0, 0, 0, 154, 153, 25, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 63 ), +"format": "RGBAFloat", +"height": 1, +"mipmaps": false, +"width": 8 +} + +[sub_resource type="ImageTexture" id=19] +flags = 0 +flags = 0 +image = SubResource( 21 ) +size = Vector2( 8, 1 ) + [sub_resource type="ShaderMaterial" id=7] shader = SubResource( 6 ) -shader_param/table = SubResource( 16 ) +shader_param/canvas_transform = Basis( 0.0194222, -0.293236, -1.35872, -0.545418, -0.0361252, 0.406385, 0, 0, 1 ) +shader_param/table = SubResource( 19 ) [sub_resource type="QuadMesh" id=8] @@ -159,10 +173,8 @@ script = ExtResource( 1 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -25.8122, 0, 0 ) [node name="Camera" type="Camera" parent="."] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 32.985 ) -projection = 1 -current = true size = 2.0 +script = ExtResource( 6 ) [node name="Sprite" type="Sprite" parent="."] position = Vector2( 619.786, 73.103 ) @@ -174,7 +186,8 @@ visible = false opacity = 0.15 texture = ExtResource( 3 ) -[node name="CSGBox" type="CSGMesh" parent="."] +[node name="CSGBox" type="CSGMesh" parent="." groups=["ListenForTransformUpdate"]] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.401247, 0.829002, -0.735263 ) mesh = SubResource( 5 ) material = SubResource( 7 ) diff --git a/addons/summer_day/main_screen.gd b/addons/summer_day/main_screen.gd index 6a2d6b0..1616661 100644 --- a/addons/summer_day/main_screen.gd +++ b/addons/summer_day/main_screen.gd @@ -1,2 +1,7 @@ +tool extends Control class_name SummerDayMainScreen + + +func _ready(): + print(get_path()) diff --git a/addons/summer_day/tool/canvas/canvas.gd b/addons/summer_day/tool/canvas/canvas.gd index 251d6e8..2a63519 100644 --- a/addons/summer_day/tool/canvas/canvas.gd +++ b/addons/summer_day/tool/canvas/canvas.gd @@ -13,13 +13,15 @@ func _ready(): tool_context.canvas_state = canvas_state canvas_state.connect("view_transform_changed", $Render/BackgroundLayer/EmptyCanvasLayer, "_on_view_transform_changed") + canvas_state.connect("clip_space_view_transform_changed", + self, "_on_clip_space_view_transform_changed") func _gui_input(event): tool_pool.run_most_prior(event, tool_context) -# _gui_input() cannot receive released event so we do this here. +# _gui_input() cannot receive screen touch released event so we do this here. func _input(event): if event is InputEventScreenTouch and !event.is_pressed(): tool_pool.run_most_prior(event, tool_context) @@ -37,9 +39,24 @@ func _on_SummerDay_scene_changed(new_scene): func _on_Canvas_resized(): canvas_state.rect_size = rect_size + canvas_state.update_canvas_to_clip_space() canvas_state.update_fill_transform(scene) func _on_scene_aspect_ratio_changed(new_aspect_ratio): $Render/BackgroundLayer/EmptyCanvasLayer.update_size(scene) canvas_state.update_fill_transform(scene) + + +func _on_clip_space_view_transform_changed(new_transform): + var listeners = get_tree().get_nodes_in_group("ListenForTransformUpdate") + for i in listeners: + var basis = Basis( + Vector3(new_transform.x.x, new_transform.x.y, 0.0), + Vector3(new_transform.y.x, new_transform.y.y, 0.0), + Vector3(new_transform.origin.x, new_transform.origin.y, 1.0) + ) + i.get_material().set_shader_param("canvas_transform", basis) + #print(i.get_material().get_shader_param("canvas_transform")) + + diff --git a/addons/summer_day/tool/canvas/canvas_state.gd b/addons/summer_day/tool/canvas/canvas_state.gd index 4986b18..dbb0a2b 100644 --- a/addons/summer_day/tool/canvas/canvas_state.gd +++ b/addons/summer_day/tool/canvas/canvas_state.gd @@ -4,12 +4,16 @@ class_name SummerDayCanvasState signal fill_transform_changed(fill_transform) signal canvas_transform_changed(canvas_transform) signal view_transform_changed(view_transform) +signal clip_space_view_transform_changed(view_transform) var rect_size: Vector2 var fill_transform := Transform2D.IDENTITY var canvas_transform := Transform2D.IDENTITY setget _set_canvas_transform -var view_transform := Transform2D.IDENTITY # fill_transform * canvas_transform +var view_transform := Transform2D.IDENTITY # canvas_transform * fill_transform + +var clip_space_view_transform := Transform2D.IDENTITY +var canvas_to_clip_space := Transform2D.IDENTITY func _init(): @@ -44,8 +48,23 @@ func update_fill_transform(scene): emit_signal("fill_transform_changed", fill_transform) +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) + ) + + func _update_view_transformation(transform): view_transform = canvas_transform * fill_transform +# var off_view_transform = view_transform +# var offset = off_view_transform.origin +# off_view_transform.origin = Vector2.ZERO + clip_space_view_transform = canvas_to_clip_space * view_transform +# clip_space_view_transform.origin = offset + + emit_signal("clip_space_view_transform_changed", clip_space_view_transform) emit_signal("view_transform_changed", view_transform) diff --git a/addons/summer_day/tool/canvas/rendering/space_camera.gd b/addons/summer_day/tool/canvas/rendering/space_camera.gd new file mode 100644 index 0000000..773f0bf --- /dev/null +++ b/addons/summer_day/tool/canvas/rendering/space_camera.gd @@ -0,0 +1,25 @@ +tool +extends Camera + + +func _ready(): + print("HowAboutNow?") + _on_view_transform_changed(Transform.IDENTITY) + + +func _on_view_transform_changed(new_transform: Transform2D): + var tran = Transform.IDENTITY + tran.origin.y = 0.5 + tran = tran.scaled(Vector3(0.2, 0.8, 1.0)) + print(tran) + var rid = VisualServer.camera_create() + var basis_scale = tran.basis.get_scale() + var scale = lerp(basis_scale.x, basis_scale.y, 0.5) + VisualServer.camera_set_orthogonal(rid, 1.0 / scale, 0.0, 500.0) + VisualServer.camera_set_transform(rid, tran)#Transform(new_transform)) + VisualServer.viewport_attach_camera(get_viewport().get_viewport_rid(), rid) + +# var tran = Transform2D.IDENTITY +# tran.y.y = -2.0 +# get_viewport().global_canvas_transform = tran + pass diff --git a/addons/summer_day/tool/tool_system/base_tool.gd b/addons/summer_day/tool/tool_system/base_tool.gd index 152d6c5..c7fc652 100644 --- a/addons/summer_day/tool/tool_system/base_tool.gd +++ b/addons/summer_day/tool/tool_system/base_tool.gd @@ -1,7 +1,6 @@ extends Reference class_name SummerDayTool - var priority = 0 var modifier_layer = 0