From bb897e7f13d410fe717024f0402046fd752cb7e7 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Fri, 18 Mar 2022 15:01:14 -0400 Subject: [PATCH] Modified Object_pickable to emit a highlight_updated signal when the highlight changes. Added a highlighter object which reacts to highlight_updated by changing mesh materials. Added a highlighter object which reacts to highlight_updated by showing/hiding itself (and children). Added a highlighter object which reacts to highlight_updated by showing/hiding a billboard target ring. --- addons/godot-xr-tools/images/ring.png | Bin 0 -> 17146 bytes addons/godot-xr-tools/images/ring.png.import | 38 +++++++++++++ .../godot-xr-tools/objects/Object_pickable.gd | 44 ++++++--------- .../objects/highlight/highlight_material.gd | 51 ++++++++++++++++++ .../objects/highlight/highlight_ring.gd | 29 ++++++++++ .../objects/highlight/highlight_ring.tres | 10 ++++ .../objects/highlight/highlight_ring.tscn | 12 +++++ .../objects/highlight/highlight_visible.gd | 30 +++++++++++ 8 files changed, 187 insertions(+), 27 deletions(-) create mode 100644 addons/godot-xr-tools/images/ring.png create mode 100644 addons/godot-xr-tools/images/ring.png.import create mode 100644 addons/godot-xr-tools/objects/highlight/highlight_material.gd create mode 100644 addons/godot-xr-tools/objects/highlight/highlight_ring.gd create mode 100644 addons/godot-xr-tools/objects/highlight/highlight_ring.tres create mode 100644 addons/godot-xr-tools/objects/highlight/highlight_ring.tscn create mode 100644 addons/godot-xr-tools/objects/highlight/highlight_visible.gd diff --git a/addons/godot-xr-tools/images/ring.png b/addons/godot-xr-tools/images/ring.png new file mode 100644 index 0000000000000000000000000000000000000000..7df5f6d4dd3c341af1c56d28ba8f3340ea4fd742 GIT binary patch literal 17146 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 literal 0 HcmV?d00001 diff --git a/addons/godot-xr-tools/images/ring.png.import b/addons/godot-xr-tools/images/ring.png.import new file mode 100644 index 00000000..5def0774 --- /dev/null +++ b/addons/godot-xr-tools/images/ring.png.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/ring.png-34d9c9e9780f2732148a5b14fcac48dd.s3tc.stex" +path.etc2="res://.import/ring.png-34d9c9e9780f2732148a5b14fcac48dd.etc2.stex" +path.etc="res://.import/ring.png-34d9c9e9780f2732148a5b14fcac48dd.etc.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2", "etc" ], +"vram_texture": true +} + +[deps] + +source_file="res://addons/godot-xr-tools/images/ring.png" +dest_files=[ "res://.import/ring.png-34d9c9e9780f2732148a5b14fcac48dd.s3tc.stex", "res://.import/ring.png-34d9c9e9780f2732148a5b14fcac48dd.etc2.stex", "res://.import/ring.png-34d9c9e9780f2732148a5b14fcac48dd.etc.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=1 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/addons/godot-xr-tools/objects/Object_pickable.gd b/addons/godot-xr-tools/objects/Object_pickable.gd index f6da5835..f6209cf5 100644 --- a/addons/godot-xr-tools/objects/Object_pickable.gd +++ b/addons/godot-xr-tools/objects/Object_pickable.gd @@ -5,7 +5,6 @@ class_name XRToolsPickable # Set hold mode export (bool) var press_to_hold = true export (bool) var reset_transform_on_pickup = true -export (NodePath) var highlight_mesh_instance = null export (int, LAYERS_3D_PHYSICS) var picked_up_layer = 0 # Remember some state so we can return to it when the user drops the object @@ -14,10 +13,6 @@ onready var original_collision_mask = collision_mask onready var original_collision_layer = collision_layer var original_mode -onready var highlight_material = preload("res://addons/godot-xr-tools/materials/highlight.tres") -var original_materials = Array() -var highlight_mesh_instance_node : MeshInstance = null - # Who picked us up? var picked_up_by = null var center_pickup_on_node = null @@ -33,6 +28,9 @@ signal dropped(pickable) # Signal emitted when the user presses the action button while holding this object signal action_pressed(pickable) +# Signal emitted when the highlight state changes +signal highlight_updated(pickable, enable) + # have we been picked up? func is_picked_up(): if picked_up_by: @@ -45,25 +43,25 @@ func action(): # let interested parties know emit_signal("action_pressed", self) -func _update_highlight(): - if highlight_mesh_instance_node: - # if we can find a node remember which materials are currently set on each surface - for i in range(0, highlight_mesh_instance_node.get_surface_material_count()): - if closest_count > 0: - highlight_mesh_instance_node.set_surface_material(i, highlight_material) - else: - highlight_mesh_instance_node.set_surface_material(i, original_materials[i]) - else: - # should probably implement this in our subclass - pass - +# This method is invoked when it becomes the closest pickable object to one of +# the pickup functions. func increase_is_closest(): + # Increment the closest counter closest_count += 1 - _update_highlight() + # If this object has just become highlighted then emit the signal + if closest_count == 1: + emit_signal("highlight_updated", self, true) + +# This method is invoked when it stops being the closest pickable object to one +# of the pickup functions. func decrease_is_closest(): + # Decrement the closest counter closest_count -= 1 - _update_highlight() + + # If no-longer highlighted then emit the signal + if closest_count == 0: + emit_signal("highlight_updated", self, false) func drop_and_free(): if picked_up_by: @@ -137,14 +135,6 @@ func let_go(p_linear_velocity = Vector3(), p_angular_velocity = Vector3()): emit_signal("dropped", self) func _ready(): - if highlight_mesh_instance: - # if we have a highlight mesh instance selected obtain our node - highlight_mesh_instance_node = get_node(highlight_mesh_instance) - if highlight_mesh_instance_node: - # if we can find a node remember which materials are currently set on each surface - for i in range(0, highlight_mesh_instance_node.get_surface_material_count()): - original_materials.push_back(highlight_mesh_instance_node.get_surface_material(i)) - # if we have center pickup on set obtain our node if reset_transform_on_pickup: center_pickup_on_node = get_node("PickupCenter") diff --git a/addons/godot-xr-tools/objects/highlight/highlight_material.gd b/addons/godot-xr-tools/objects/highlight/highlight_material.gd new file mode 100644 index 00000000..cde83452 --- /dev/null +++ b/addons/godot-xr-tools/objects/highlight/highlight_material.gd @@ -0,0 +1,51 @@ +tool +class_name XRTHighlightMaterial +extends Node + + +## Mesh to highlight +export(NodePath) var highlight_mesh_instance + +## Material to set +export(Resource) var highlight_material + + +var _original_materials = Array() +var _highlight_mesh_instance: MeshInstance + + +# Called when the node enters the scene tree for the first time. +func _ready(): + # Get the mesh to highlight + _highlight_mesh_instance = get_node(highlight_mesh_instance) + + # Save the materials + if _highlight_mesh_instance: + # if we can find a node remember which materials are currently set on each surface + for i in range(0, _highlight_mesh_instance.get_surface_material_count()): + _original_materials.push_back(_highlight_mesh_instance.get_surface_material(i)) + + # Hook the highlight update + get_parent().connect("highlight_updated", self, "_on_highlight_updated") + + +# Called when the pickable highlight changes +func _on_highlight_updated(pickable, enable: bool) -> void: + # Set the materials + if _highlight_mesh_instance: + for i in range(0, _highlight_mesh_instance.get_surface_material_count()): + if enable: + _highlight_mesh_instance.set_surface_material(i, highlight_material) + else: + _highlight_mesh_instance.set_surface_material(i, _original_materials[i]) + + +# This method verifies the node +func _get_configuration_warning(): + # Verify parent supports highlighting + var parent := get_parent() + if not parent or not parent.has_signal("highlight_updated"): + return "Parent does not support highlighting" + + # No issues + return "" diff --git a/addons/godot-xr-tools/objects/highlight/highlight_ring.gd b/addons/godot-xr-tools/objects/highlight/highlight_ring.gd new file mode 100644 index 00000000..ab17aa6a --- /dev/null +++ b/addons/godot-xr-tools/objects/highlight/highlight_ring.gd @@ -0,0 +1,29 @@ +tool +class_name XRTHighlightRing +extends MeshInstance + + +# Called when the node enters the scene tree for the first time. +func _ready(): + # Turn off until requested + if not Engine.editor_hint: + visible = false + + # Hook the highlight update + get_parent().connect("highlight_updated", self, "_on_highlight_updated") + + +# Called when the pickable highlight changes +func _on_highlight_updated(pickable, enable: bool) -> void: + visible = enable + + +# This method verifies the node +func _get_configuration_warning(): + # Verify parent supports highlighting + var parent := get_parent() + if not parent or not parent.has_signal("highlight_updated"): + return "Parent does not support highlighting" + + # No issues + return "" diff --git a/addons/godot-xr-tools/objects/highlight/highlight_ring.tres b/addons/godot-xr-tools/objects/highlight/highlight_ring.tres new file mode 100644 index 00000000..ebe21dac --- /dev/null +++ b/addons/godot-xr-tools/objects/highlight/highlight_ring.tres @@ -0,0 +1,10 @@ +[gd_resource type="SpatialMaterial" load_steps=2 format=2] + +[ext_resource path="res://addons/godot-xr-tools/images/ring.png" type="Texture" id=1] + +[resource] +flags_transparent = true +flags_unshaded = true +flags_no_depth_test = true +params_billboard_mode = 1 +albedo_texture = ExtResource( 1 ) diff --git a/addons/godot-xr-tools/objects/highlight/highlight_ring.tscn b/addons/godot-xr-tools/objects/highlight/highlight_ring.tscn new file mode 100644 index 00000000..bd7444cc --- /dev/null +++ b/addons/godot-xr-tools/objects/highlight/highlight_ring.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/godot-xr-tools/objects/highlight/highlight_ring.gd" type="Script" id=1] +[ext_resource path="res://addons/godot-xr-tools/objects/highlight/highlight_ring.tres" type="Material" id=2] + +[sub_resource type="QuadMesh" id=1] +size = Vector2( 0.05, 0.05 ) + +[node name="XRTHighlightRing" type="MeshInstance"] +mesh = SubResource( 1 ) +material/0 = ExtResource( 2 ) +script = ExtResource( 1 ) diff --git a/addons/godot-xr-tools/objects/highlight/highlight_visible.gd b/addons/godot-xr-tools/objects/highlight/highlight_visible.gd new file mode 100644 index 00000000..b559efc1 --- /dev/null +++ b/addons/godot-xr-tools/objects/highlight/highlight_visible.gd @@ -0,0 +1,30 @@ +tool +class_name XRTHighlightVisible +extends Spatial + + + +# Called when the node enters the scene tree for the first time. +func _ready(): + # Turn off until requested + if not Engine.editor_hint: + visible = false + + # Hook the highlight update + get_parent().connect("highlight_updated", self, "_on_highlight_updated") + + +# Called when the pickable highlight changes +func _on_highlight_updated(pickable, enable: bool) -> void: + visible = enable + + +# This method verifies the node +func _get_configuration_warning(): + # Verify parent supports highlighting + var parent := get_parent() + if not parent or not parent.has_signal("highlight_updated"): + return "Parent does not support highlighting" + + # No issues + return ""