Implemented interaction hints.

This commit is contained in:
mono 2022-01-03 23:53:28 +01:00
parent d7f1df9dc5
commit 97ed921f20
21 changed files with 192 additions and 34 deletions

9
Buctton.gd Normal file
View File

@ -0,0 +1,9 @@
tool
extends Button
func _on_Button_pressed():
print(SummerDay.test)
print(SummerDay.canvas_state.test)
print(SummerDay.canvas_state.fill_transform)
print(SummerDay.canvas_state.rect_size)

View File

@ -17,3 +17,29 @@ func _interact(event: InputEvent) -> bool: # Virtual.
func _update_table(table: SummerDayTable): # Virtual.
pass
func _draw_interaction_hint(): # Virtual.
pass
func update_interaction_hint():
SummerDay.interaction_hint.clear()
_draw_interaction_hint()
func draw_dot(position: Vector3, color: Color):
SummerDay.interaction_hint.draw_dot(position, color)
func draw_line(position_1: Vector3, position_2: Vector3,
color: Color, second_color = null
):
var color_2: Color
if second_color == null:
color_2 = color
else:
color_2 = second_color
SummerDay.interaction_hint.draw_line(
position_1, position_2, color, color_2
)

View File

@ -15,6 +15,7 @@ export(PoolVector2Array) var vertices = PoolVector2Array([
Vector2(-0.1, 0.4),
])
var picked_point = -1
func _check_for_selection_candidate(event: InputEvent) -> bool: # Virtual.
@ -25,7 +26,21 @@ func _check_for_selection_candidate(event: InputEvent) -> bool: # Virtual.
func _interact(event: InputEvent) -> bool: # Virtual.
return false
if event is InputEventMouseButton:
if event.button_index == BUTTON_LEFT:
if event.pressed:
_pick_point(event.position)
else:
picked_point = -1
if event is InputEventMouseMotion:
if picked_point != -1:
vertices[picked_point] = event.position
#_update_table()
update_interaction_hint()
return true
func _update_table(table: SummerDayTable): # Virtual.
@ -35,4 +50,48 @@ func _update_table(table: SummerDayTable): # Virtual.
func _is_point_included(point: Vector2) -> bool: # Private.
var convex_hull = Geometry.convex_hull_2d(vertices)
return Geometry.is_point_in_polygon(point, convex_hull)
func _draw_interaction_hint():
for i in range(4):
var vertex_2d = vertices[i]
var vertex = _with_z(vertex_2d, 0.0)
draw_dot(vertex, Color.cornflower)
for i in range(4, 8):
var vertex_2d = vertices[i]
var vertex = _with_z(vertex_2d, -1.0)
draw_dot(vertex, Color.crimson)
for i in range(4):
draw_line(
_with_z(vertices[i], 0.0),
_with_z(vertices[wrapi(i + 1, 0, 4)], 0.0),
Color.cornflower
)
for i in range(4):
draw_line(
_with_z(vertices[i], 0.0),
_with_z(vertices[i + 4], -1.0),
Color.cornflower,
Color.crimson
)
for i in range(4):
draw_line(
_with_z(vertices[i + 4], -1.0),
_with_z(vertices[wrapi(i + 5, 4, 8)], -1.0),
Color.crimson
)
func _pick_point(mouse_pos):
var picked_point_so_far = -1
var nearest_distance = 0.02
for i in vertices.size():
var distance = vertices[i].distance_to(mouse_pos)
if distance < nearest_distance:
nearest_distance = distance
picked_point_so_far = i
picked_point = picked_point_so_far
func _with_z(vector: Vector2, z: float) -> Vector3:
return Vector3(vector.x, vector.y, z)

View File

@ -15,8 +15,14 @@ func _pass_input(event: InputEvent): # Virtual.
if success:
block_selection = true
if !block_selection:
selected.clear()
for i in editable_list:
if i._check_for_selection_candidate(event):
selected.clear()
selected.append(i)
i.update_interaction_hint()
print("YOU CLICKED!!")
func update_interaction_hint():
for i in selected:
i.update_interaction_hint()

View File

@ -13,10 +13,14 @@ export(Array, Resource) var tracks
var raw_aspect_ratio setget , _get_raw_aspect_ratio
var selected_track
func setup_tracks():
func setup():
for track in tracks:
selected_track = track
emit_signal("track_added", track)
update_interaction_hint()
func add_track(blueprint: SummerDayBlueprint):
@ -24,6 +28,7 @@ func add_track(blueprint: SummerDayBlueprint):
track.blueprint = blueprint
track.add_cell(0)
tracks.append(track)
selected_track = track
emit_signal("track_added", track)
@ -34,6 +39,11 @@ func create_scene() -> SummerDayScene:
return _scene
func update_interaction_hint():
if selected_track:
selected_track.update_interaction_hint()
func _set_resolution(new_resolution):
var handled_resolution = Vector2()

View File

@ -31,3 +31,9 @@ func pass_local_input(event: InputEvent):
var current_cell = get_current_cell()
if current_cell:
current_cell._pass_input(event)
func update_interaction_hint():
var cell = get_current_cell()
if cell:
cell.update_interaction_hint()

View File

@ -1,7 +1,8 @@
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://addons/summer_day/user_interface/canvas/canvas.tscn" type="PackedScene" id=1]
[ext_resource path="res://addons/summer_day/main_screen.gd" type="Script" id=2]
[ext_resource path="res://Buctton.gd" type="Script" id=3]
[node name="MainScreen" type="Control"]
anchor_right = 1.0
@ -13,3 +14,11 @@ __meta__ = {
}
[node name="Canvas" parent="." instance=ExtResource( 1 )]
[node name="Button" type="Button" parent="."]
margin_right = 63.0
margin_bottom = 20.0
text = "PRESS"
script = ExtResource( 3 )
[connection signal="pressed" from="Button" to="Button" method="_on_Button_pressed"]

View File

@ -19,6 +19,8 @@ func _enter_tree():
canvas_instance = main_screen_instance.get_node("Canvas")
self.connect("document_changed",
canvas_instance, "_on_SummerDay_document_changed")
canvas_instance.connect("resized",
canvas_instance, "_on_Canvas_resized")
# Add the main panel to the editor's main viewport.
get_editor_interface().get_editor_viewport().add_child(main_screen_instance)
# Hide the main panel. Very much required.
@ -46,6 +48,13 @@ func _exit_tree():
remove_control_from_bottom_panel(timeline_instance)
func enable_plugin():
add_autoload_singleton(
"SummerDay",
"res://addons/summer_day/utilities/summer_day_globals.gd"
)
func disable_plugin():
remove_autoload_singleton("SummerDay")
@ -70,8 +79,9 @@ func handles(object):
func edit(object):
if object != $"/root/SummerDay".document:
$"/root/SummerDay".document = object
var _SummerDay = $"/root/SummerDay"
if object != _SummerDay.document:
_SummerDay.document = object
emit_signal("document_changed", object)
@ -88,6 +98,7 @@ func _initilize():
"SummerDay",
"res://addons/summer_day/utilities/summer_day_globals.gd"
)
MainScreen = load("res://addons/summer_day/main_screen.tscn")
Timeline = load("res://addons/summer_day/user_interface/timeline/timeline.tscn")
Document = load("res://addons/summer_day/data/document/document.gd")

View File

@ -1,3 +1,4 @@
tool
extends SummerDayTool
class_name SummerDayFreeTransformCanvasTool

View File

@ -1,3 +1,4 @@
tool
extends SummerDayTool
class_name SummerDayHandCanvasTool

View File

@ -1,3 +1,4 @@
tool
extends SummerDayTool
class_name SummerDayPenCanvasTool
@ -8,7 +9,7 @@ func _init():
func _check_for_use(event: InputEvent):
if event is InputEventMouseButton:
if event.button_index == BUTTON_LEFT and event.is_pressed():
if event.button_index == BUTTON_LEFT:
return true
if event is InputEventMouseMotion:

View File

@ -1,3 +1,4 @@
tool
extends SummerDayTool
class_name SummerDayRotationCanvasTool

View File

@ -1,3 +1,4 @@
tool
extends SummerDayToolPool
class_name SummerDayCanvasToolPool

View File

@ -1,3 +1,4 @@
tool
extends SummerDayTool
class_name SummerDayZoomCanvasTool

View File

@ -44,12 +44,11 @@ func drop_data(position, data):
func _on_SummerDay_document_changed(new_doc):
new_doc.connect("track_added",
MeshContainer, "_on_Document_add_track")
new_doc.setup_tracks()
new_doc.setup()
canvas_state.update_fill_transform()
new_doc.connect("resolution_changed",
self, "_on_scene_aspect_ratio_changed")
$Render/Label.text = str(new_doc) + "\n" + str(new_doc.resolution)
canvas_state.update_fill_transform()
func _on_Canvas_resized():
@ -85,7 +84,10 @@ func _on_view_transform_changed(canvas_transform, spatial_transform):
var mat = mesh.surface_get_material(i)
mat.set_shader_param("canvas_transform", basis)
else:
l.get_material().set_shader_param("canvas_transform", basis)
if l.has_method("get_material"):
l.get_material().set_shader_param("canvas_transform", basis)
else:
l.material_override.set_shader_param("canvas_transform", basis)
func _on_canvas_polygon_changed(new_polygon):

View File

@ -27,19 +27,31 @@ blend_mode = 3
[sub_resource type="Shader" id=6]
code = "shader_type spatial;
render_mode blend_mix, depth_draw_opaque, unshaded, depth_test_disable;
render_mode blend_mix,depth_draw_opaque,cull_disabled,unshaded,depth_test_disable,skip_vertex_transform;
uniform mat3 canvas_transform;
void vertex() {
vec4 pre = vec4(VERTEX, 1.0);
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() {
float depth = texture(DEPTH_TEXTURE, SCREEN_UV).r;
float weight = clamp((FRAGCOORD.z - depth) * float(0xFFFFFF), 0.0, 0.66);
vec3 screen_color = texture(SCREEN_TEXTURE, SCREEN_UV).rgb;
ALBEDO = mix(ALBEDO, screen_color, weight);
ALBEDO = mix(COLOR.rgb, screen_color, weight);
}"
[sub_resource type="ShaderMaterial" id=7]
render_priority = 1
shader = SubResource( 6 )
shader_param/canvas_transform = Basis( 0.587128, 0, -0.414469, 0, -0.943144, 0.393899, 0, 0, 1 )
[node name="Canvas" type="PanelContainer"]
anchor_right = 1.0
@ -102,7 +114,7 @@ invert_enable = true
invert_border = 1000.0
polygon = PoolVector2Array( 0, 0, 1.77778, 0, 1.77778, 1, 0, 1 )
[node name="InteractionHint" type="ImmediateGeometry" parent="Render/RenderLayer"]
[node name="InteractionHint" type="ImmediateGeometry" parent="Render/RenderLayer" groups=["SummerDaySpatialTransform"]]
material_override = SubResource( 7 )
script = ExtResource( 3 )
@ -117,5 +129,3 @@ gui_disable_input = true
[node name="Label" type="Label" parent="Render"]
margin_right = 40.0
margin_bottom = 14.0
[connection signal="resized" from="." to="." method="_on_Canvas_resized"]

View File

@ -3,10 +3,12 @@ class_name SummerDayCanvasState
signal fill_transform_changed(fill_transform)
signal canvas_transform_changed(canvas_transform)
signal view_transform_changed(view_transform)
signal view_transform_changed(view_transform, spatial_transform)
signal canvas_polygon_changed(polygon)
var test = "Das ist im Canvas_State"
var rect_size: Vector2
var fill_transform := Transform2D.IDENTITY
@ -52,7 +54,7 @@ func update_fill_transform():
translation
)
_update_canvas_polygon()
#_update_canvas_polygon()
emit_signal("fill_transform_changed", fill_transform)

View File

@ -7,28 +7,28 @@ var canvas_state: SummerDayCanvasState # Provided through Canvas.
func draw_dot(position: Vector3, color: Color):
var transformation = SummerDay.canvas_state.clip_space_view_transform
var transformed_position = transformation.xform(position)
var radius = 3.0
var vertex_count = 12.0
var radius = 0.0085
var vertex_count = 6.0
begin(Mesh.PRIMITIVE_TRIANGLE_FAN)
set_color(color)
for i in range(vertex_count):
var weight = i / vertex_count
var offset = Vector3(sin(weight * TAU), cos(weight * TAU), 0.0)
add_vertex(transformed_position + offset)
var offset = Vector3(
sin(weight * TAU) * radius,
cos(weight * TAU) * radius,
0.0
)
add_vertex(position + offset)
end()
func draw_line(position_1: Vector3, position_2: Vector3, color: Color):
var transformation = SummerDay.canvas_state.clip_space_view_transform
var transformed_position_1 = transformation.xform(position_1)
var transformed_position_2 = transformation.xform(position_2)
func draw_line(position_1: Vector3, position_2: Vector3,
color_1: Color, color_2: Color
):
begin(Mesh.PRIMITIVE_LINES)
set_color(color)
add_vertex(transformed_position_1)
add_vertex(transformed_position_2)
set_color(color_1)
add_vertex(position_1)
set_color(color_2)
add_vertex(position_2)
end()

View File

@ -2,6 +2,8 @@ tool
extends Node
var test = "Jojojawdfq"
var document: SummerDayDocument
var canvas_state: SummerDayCanvasState
var interaction_hint: SummerDayInteractionHint

View File

@ -9,7 +9,7 @@
[sub_resource type="Resource" id=1]
script = ExtResource( 6 )
vertices = PoolVector2Array( -0.4, -0.4, 0.1, -0.4, 0.1, 0.1, -0.4, 0.1, -0.1, -0.1, 0.4, -0.1, 0.4, 0.4, -0.1, 0.4 )
vertices = PoolVector2Array( -0.4, -0.4, 0.1, -0.4, 0.113769, -0.0876254, -0.4, 0.1, -0.1, -0.1, 0.4, -0.1, 0.4, 0.4, -0.1, 0.4 )
[sub_resource type="Resource" id=2]
script = ExtResource( 3 )

View File

@ -55,5 +55,5 @@ void fragment() {
[resource]
shader = SubResource( 1 )
shader_param/canvas_transform = Basis( -0.100636, -0.496363, 0.0452502, -0.707523, 0.143448, 0.352804, 0, 0, 1 )
shader_param/canvas_transform = Basis( 0.999546, 0, -0.0981899, 0, -1.22596, -0.0477029, 0, 0, 1 )
shader_param/table = ExtResource( 1 )