From 83d6a316832c438b664eff4addca95c47961f880 Mon Sep 17 00:00:00 2001 From: mono Date: Sun, 2 Jan 2022 03:09:18 +0100 Subject: [PATCH] Implemented basic functionality for interaction with editables. --- Bullshit/new_packedscene.tscn | 24 +++++++-- addons/summer_day/data/blueprint/editable.gd | 28 ++++------- .../data/blueprint/template_editables/tube.gd | 50 ++++++++++++------- addons/summer_day/data/document/cell.gd | 15 +++++- .../user_interface/canvas/canvas.tscn | 25 ++++++++-- .../canvas/rendering/interaction_hint.gd | 38 ++++++++++++++ .../utilities/summer_day_globals.gd | 4 ++ project.godot | 6 +++ 8 files changed, 147 insertions(+), 43 deletions(-) create mode 100644 addons/summer_day/user_interface/canvas/rendering/interaction_hint.gd create mode 100644 addons/summer_day/utilities/summer_day_globals.gd diff --git a/Bullshit/new_packedscene.tscn b/Bullshit/new_packedscene.tscn index 843f517..4851f5e 100644 --- a/Bullshit/new_packedscene.tscn +++ b/Bullshit/new_packedscene.tscn @@ -1,6 +1,21 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=4 format=2] -[ext_resource path="res://production/blueprints/mannequin/mat.tres" type="Material" id=1] +[sub_resource type="Shader" id=3] +code = "shader_type spatial; +render_mode blend_mix, depth_draw_opaque, unshaded, depth_test_disable; + + +void fragment() { + //ALBEDO = vec3(0.8, 0.2, 0.2); + float depth = texture(DEPTH_TEXTURE, SCREEN_UV).r; + float weight = clamp((depth - FRAGCOORD.z) * 1000000000.0, 0.0, 0.5); + vec3 screen_color = texture(SCREEN_TEXTURE, SCREEN_UV).rgb; + ALBEDO = mix(vec3(0.8, 1.2, 0.2), screen_color, weight); +}" + +[sub_resource type="ShaderMaterial" id=4] +render_priority = 1 +shader = SubResource( 3 ) [sub_resource type="ArrayMesh" id=2] surfaces/0 = { @@ -16,6 +31,9 @@ surfaces/0 = { } [node name="TestCapsule" type="MeshInstance" groups=["SummerDaySpatialTransform"]] -material_override = ExtResource( 1 ) +material_override = SubResource( 4 ) mesh = SubResource( 2 ) material/0 = null + +[node name="CSGSphere" type="CSGSphere" parent="."] +transform = Transform( 4.9, 0, 0, 0, 3.64893, 0, 0, 0, 4.84088, -0.126031, -0.175355, -8.52605 ) diff --git a/addons/summer_day/data/blueprint/editable.gd b/addons/summer_day/data/blueprint/editable.gd index ece4d2c..032edbf 100644 --- a/addons/summer_day/data/blueprint/editable.gd +++ b/addons/summer_day/data/blueprint/editable.gd @@ -3,23 +3,17 @@ extends Resource class_name SummerDayEditable -var priority = 0 -var modifier_layer = 0 -var selected = false +var preference_number = 0 -func _check_for_selection(event: InputEvent): # Virtual. - pass - - -func _interact(event: InputEvent): # Virtual. - pass - - -func _update_table(table: Image): # Virtual. - pass - - -func _is_point_included(point: Vector2) -> bool: # Virtual. +func _check_for_selection_candidate(event: InputEvent) -> bool: # Virtual. return false - + + +# Returns false if input was potentially meant for a different editable. +func _interact(event: InputEvent) -> bool: # Virtual. + return false + + +func _update_table(table: SummerDayTable): # Virtual. + pass diff --git a/addons/summer_day/data/blueprint/template_editables/tube.gd b/addons/summer_day/data/blueprint/template_editables/tube.gd index a908eba..00e1d4e 100644 --- a/addons/summer_day/data/blueprint/template_editables/tube.gd +++ b/addons/summer_day/data/blueprint/template_editables/tube.gd @@ -3,22 +3,36 @@ extends SummerDayEditable class_name SummerDayEditableTube -func _check_for_selection(event: InputEvent): # Virtual. - pass - - -func _interact(event: InputEvent): # Virtual. - pass - - -func update_table(): - pass # TODO: Do I even need this?! - - -func _update_table(table: Image): # Virtual. - pass - - -func _is_point_included(point: Vector2) -> bool: # Virtual. - return false +export(PoolVector2Array) var vertices = PoolVector2Array([ + Vector2(-0.4, -0.4), + Vector2(0.1, -0.4), + Vector2(0.1, 0.1), + Vector2(-0.4, 0.1), + + Vector2(-0.1, -0.1), + Vector2(0.4, -0.1), + Vector2(0.4, 0.4), + Vector2(-0.1, 0.4), + ]) + + + +func _check_for_selection_candidate(event: InputEvent) -> bool: # Virtual. + if event is InputEventMouseButton: + if event.button_index == BUTTON_LEFT and event.pressed: + return _is_point_included(event.position) + return false + + +func _interact(event: InputEvent) -> bool: # Virtual. + return false + + +func _update_table(table: SummerDayTable): # Virtual. + pass + + +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) diff --git a/addons/summer_day/data/document/cell.gd b/addons/summer_day/data/document/cell.gd index 6bc7856..53239cb 100644 --- a/addons/summer_day/data/document/cell.gd +++ b/addons/summer_day/data/document/cell.gd @@ -5,7 +5,18 @@ class_name SummerDayCell export(Array, Resource) var editable_list := [] +var selected = [] + func _pass_input(event: InputEvent): # Virtual. - for i in editable_list: - i._check_for_selection(event) + var block_selection = false + if selected.size() == 1: + var success = selected[0]._interact(event) + if success: + block_selection = true + if !block_selection: + selected.clear() + for i in editable_list: + if i._check_for_selection_candidate(event): + selected.append(i) + print("YOU CLICKED!!") diff --git a/addons/summer_day/user_interface/canvas/canvas.tscn b/addons/summer_day/user_interface/canvas/canvas.tscn index 6c27127..259e0c6 100644 --- a/addons/summer_day/user_interface/canvas/canvas.tscn +++ b/addons/summer_day/user_interface/canvas/canvas.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=8 format=2] +[gd_scene load_steps=11 format=2] [ext_resource path="res://addons/summer_day/user_interface/canvas/canvas.gd" type="Script" id=1] [ext_resource path="res://addons/summer_day/user_interface/canvas/mesh_container.gd" type="Script" id=2] +[ext_resource path="res://addons/summer_day/user_interface/canvas/rendering/interaction_hint.gd" type="Script" id=3] [sub_resource type="StyleBoxFlat" id=3] bg_color = Color( 0.180392, 0.172549, 0.203922, 1 ) @@ -24,6 +25,22 @@ environment = SubResource( 1 ) [sub_resource type="CanvasItemMaterial" id=5] blend_mode = 3 +[sub_resource type="Shader" id=6] +code = "shader_type spatial; +render_mode blend_mix, depth_draw_opaque, unshaded, depth_test_disable; + + +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); +}" + +[sub_resource type="ShaderMaterial" id=7] +render_priority = 1 +shader = SubResource( 6 ) + [node name="Canvas" type="PanelContainer"] anchor_right = 1.0 anchor_bottom = 1.0 @@ -85,6 +102,10 @@ 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"] +material_override = SubResource( 7 ) +script = ExtResource( 3 ) + [node name="ForegroundLayer" type="Viewport" parent="Render" groups=["SummerDayCanvasTransform"]] size = Vector2( 998, 574 ) transparent_bg = true @@ -93,8 +114,6 @@ usage = 0 render_target_update_mode = 3 gui_disable_input = true -[node name="EditHints" type="ImmediateGeometry" parent="Render/ForegroundLayer"] - [node name="Label" type="Label" parent="Render"] margin_right = 40.0 margin_bottom = 14.0 diff --git a/addons/summer_day/user_interface/canvas/rendering/interaction_hint.gd b/addons/summer_day/user_interface/canvas/rendering/interaction_hint.gd new file mode 100644 index 0000000..a6f1c2c --- /dev/null +++ b/addons/summer_day/user_interface/canvas/rendering/interaction_hint.gd @@ -0,0 +1,38 @@ +tool +extends ImmediateGeometry +class_name SummerDayInteractionHint + + +var canvas_state: SummerDayCanvasState # Provided through Canvas. + + +func draw_dot(position: Vector3, color: Color): + var transformed_position = canvas_state.clip_space_view_transform.xform( + position + ) + + var radius = 3.0 + var vertex_count = 12.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) + end() + + +func draw_line(position_1: Vector3, position_2: Vector3, color: Color): + var transformed_position_1 = canvas_state.clip_space_view_transform.xform( + position_1 + ) + var transformed_position_2 = canvas_state.clip_space_view_transform.xform( + position_2 + ) + + begin(Mesh.PRIMITIVE_LINES) + set_color(color) + add_vertex(transformed_position_1) + add_vertex(transformed_position_2) + end() diff --git a/addons/summer_day/utilities/summer_day_globals.gd b/addons/summer_day/utilities/summer_day_globals.gd new file mode 100644 index 0000000..ec0130a --- /dev/null +++ b/addons/summer_day/utilities/summer_day_globals.gd @@ -0,0 +1,4 @@ +extends Node + + +#var canvas_state: SummerDayCanvasState diff --git a/project.godot b/project.godot index 6ba8585..a70126f 100644 --- a/project.godot +++ b/project.godot @@ -94,6 +94,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://addons/summer_day/tools/canvas/general_use/hand.gd" }, { +"base": "ImmediateGeometry", +"class": "SummerDayInteractionHint", +"language": "GDScript", +"path": "res://addons/summer_day/user_interface/canvas/rendering/interaction_hint.gd" +}, { "base": "Control", "class": "SummerDayMainScreen", "language": "GDScript", @@ -202,6 +207,7 @@ _global_script_class_icons={ "SummerDayEditableTube": "", "SummerDayFreeTransformCanvasTool": "", "SummerDayHandCanvasTool": "", +"SummerDayInteractionHint": "", "SummerDayMainScreen": "", "SummerDayMathHelper": "", "SummerDayMatrix4": "",