diff --git a/misc/multitouch_cubes/CubeScene.tscn b/misc/multitouch_cubes/CubeScene.tscn new file mode 100644 index 00000000..9f6e188d --- /dev/null +++ b/misc/multitouch_cubes/CubeScene.tscn @@ -0,0 +1,125 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://default_env.tres" type="Environment" id=1] + +[sub_resource type="SpatialMaterial" id=1] + +render_priority = 0 +flags_transparent = false +flags_unshaded = false +flags_vertex_lighting = false +flags_no_depth_test = false +flags_use_point_size = false +flags_world_triplanar = false +flags_fixed_size = false +vertex_color_use_as_albedo = false +vertex_color_is_srgb = false +params_diffuse_mode = 1 +params_specular_mode = 0 +params_blend_mode = 0 +params_cull_mode = 0 +params_depth_draw_mode = 0 +params_line_width = 1.0 +params_point_size = 1.0 +params_billboard_mode = 0 +params_grow = false +params_use_alpha_scissor = false +albedo_color = Color( 0.149414, 0.796875, 0.569252, 1 ) +metallic = 0.0 +metallic_specular = 0.5 +metallic_texture_channel = 0 +roughness = 0.0 +roughness_texture_channel = 0 +emission_enabled = false +normal_enabled = false +rim_enabled = false +clearcoat_enabled = false +anisotropy_enabled = false +ao_enabled = false +depth_enabled = false +subsurf_scatter_enabled = false +transmission_enabled = false +refraction_enabled = false +detail_enabled = false +uv1_scale = Vector3( 1, 1, 1 ) +uv1_offset = Vector3( 0, 0, 0 ) +uv1_triplanar = false +uv1_triplanar_sharpness = 1.0 +uv2_scale = Vector3( 1, 1, 1 ) +uv2_offset = Vector3( 0, 0, 0 ) +uv2_triplanar = false +uv2_triplanar_sharpness = 1.0 +proximity_fade_enable = false +distance_fade_enable = false + +[sub_resource type="CubeMesh" id=2] + +size = Vector3( 2, 2, 2 ) +subdivide_width = 0 +subdivide_height = 0 +subdivide_depth = 0 + +[node name="Spatial" type="Spatial"] + +[node name="MeshInstance" type="MeshInstance" parent="."] + +transform = Transform( 0.707107, 0, -0.707107, -0.353553, 0.866025, -0.353553, 0.612372, 0.5, 0.612372, 0, 0, 0 ) +layers = 1 +material_override = SubResource( 1 ) +cast_shadow = 1 +extra_cull_margin = 0.0 +use_in_baked_light = false +lod_min_distance = 0.0 +lod_min_hysteresis = 0.0 +lod_max_distance = 0.0 +lod_max_hysteresis = 0.0 +mesh = SubResource( 2 ) +skeleton = NodePath("..") +material/0 = null + +[node name="DirectionalLight" type="DirectionalLight" parent="."] + +transform = Transform( 0.926535, 0.11439, -0.358396, 0.199614, 0.658013, 0.726067, 0.318884, -0.744267, 0.586839, 0, 4.14991, 0 ) +layers = 1 +light_color = Color( 1, 1, 1, 1 ) +light_energy = 1.0 +light_indirect_energy = 1.0 +light_negative = false +light_specular = 0.5 +light_cull_mask = -1 +shadow_enabled = false +shadow_color = Color( 0, 0, 0, 1 ) +shadow_bias = 0.1 +shadow_contact = 0.0 +shadow_reverse_cull_face = false +editor_only = false +directional_shadow_mode = 2 +directional_shadow_split_1 = 0.1 +directional_shadow_split_2 = 0.2 +directional_shadow_split_3 = 0.5 +directional_shadow_blend_splits = false +directional_shadow_normal_bias = 0.8 +directional_shadow_bias_split_scale = 0.25 +directional_shadow_depth_range = 0 +directional_shadow_max_distance = 200.0 + +[node name="Camera" type="Camera" parent="."] + +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 7.09558 ) +projection = 0 +fov = 50.0 +near = 0.1 +far = 100.0 +keep_aspect = 1 +current = false +cull_mask = 1048575 +environment = null +h_offset = 0.0 +v_offset = 0.0 +doppler/tracking = 0 + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] + +environment = ExtResource( 1 ) + + diff --git a/misc/multitouch_cubes/GestureArea.gd b/misc/multitouch_cubes/GestureArea.gd new file mode 100644 index 00000000..d50f645b --- /dev/null +++ b/misc/multitouch_cubes/GestureArea.gd @@ -0,0 +1,131 @@ +extends Control + +export(NodePath) var target +export var min_scale = 0.1 +export var max_scale = 3.0 +export var one_finger_rot_x = true +export var one_finger_rot_y = true +export var two_fingers_rot_z = true +export var two_fingers_zoom = true + +var base_state +var curr_state + +var target_node + +# We keep here a copy of the state before the number of fingers changed to avoid accumulation errors +var base_xform + +func _ready(): + base_state = {} + curr_state = {} + target_node = get_node(target) + +func _gui_input(event): + # We must start touching inside, but we can drag or unpress outside +# if !(event is InputEventScreenDrag || +# (event is InputEventScreenTouch && (!event.pressed || get_global_rect().has_point(event.position)))): +# return + + var finger_count_changed = false + var finger_count = base_state.size() + + if finger_count == 0: + # No fingers => Accept press + + if event is InputEventScreenTouch: + if event.pressed: + # A finger started touching + + base_state = { + event.index: event.position, + } + + elif finger_count == 1: + # One finger => For rotating around X and Y + # Accept one more press, unpress or drag + + if event is InputEventScreenTouch: + if event.pressed: + # One more finger started touching + + # Reset the base state to the only current and the new fingers + base_state = { + curr_state.keys()[0]: curr_state.values()[0], + event.index: event.position, + } + else: + if base_state.has(event.index): + # Only touching finger released + + base_state.clear() + + elif event is InputEventScreenDrag: + if curr_state.has(event.index): + # Touching finger dragged + + var unit_drag = _px2unit(base_state[base_state.keys()[0]] - event.position) + if one_finger_rot_x: + target_node.global_rotate(Vector3(0, 1, 0), deg2rad(180.0 * unit_drag.x)) + if one_finger_rot_y: + target_node.global_rotate(Vector3(1, 0, 0), deg2rad(180.0 * unit_drag.y)) + # Since rotating around two axes, we have to reset the base constantly + curr_state[event.index] = event.position + base_state[event.index] = event.position + base_xform = target_node.get_transform() + + elif finger_count == 2: + # Two fingers => To pinch-zoom and rotate around Z + # Accept unpress or drag + + if event is InputEventScreenTouch: + if !event.pressed && base_state.has(event.index): + # Some known touching finger released + + # Remove released finger from the base state + base_state.erase(event.index) + # Reset the base state to the now only toyching finger + base_state = { + curr_state.keys()[0]: curr_state.values()[0], + } + + elif event is InputEventScreenDrag: + if curr_state.has(event.index): + # Some known touching finger dragged + + # Update + curr_state[event.index] = event.position + + # Compute base and current inter-finger vectors + var base_segment = base_state[base_state.keys()[0]] - base_state[base_state.keys()[1]] + var new_segment = curr_state[curr_state.keys()[0]] - curr_state[curr_state.keys()[1]] + + # Get the base scale from the base matrix + var base_scale = Vector3(base_xform.basis.x.x, base_xform.basis.y.y, base_xform.basis.z.z).length() + + if two_fingers_zoom: + # Compute the new scale limiting it and taking into account the base scale + var new_scale = clamp(base_scale * (new_segment.length() / base_segment.length()), min_scale, max_scale) / base_scale + target_node.set_transform(base_xform.scaled(new_scale * Vector3(1, 1, 1))) + else: + target_node.set_transform(base_xform) + + if two_fingers_rot_z: + # Apply rotation between base inter-finger vector and the current one + var rot = new_segment.angle_to(base_segment) + target_node.global_rotate(Vector3(0, 0, 1), rot) + + # Finger count changed? + if base_state.size() != finger_count: + # Copy new base state to the current state + curr_state = {} + for idx in base_state.keys(): + curr_state[idx] = base_state[idx] + # Remember the base transform + base_xform = target_node.get_transform() + +# Converts a vector in pixels to a unitary magnitude, +# considering the number of pixels of the shorter axis is the unit +func _px2unit(v): + var shortest = min(get_size().x, get_size().y) + return v * (1.0 / shortest) diff --git a/misc/multitouch_cubes/Main.tscn b/misc/multitouch_cubes/Main.tscn new file mode 100644 index 00000000..2b0a98ae --- /dev/null +++ b/misc/multitouch_cubes/Main.tscn @@ -0,0 +1,376 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://GestureArea.gd" type="Script" id=1] +[ext_resource path="res://CubeScene.tscn" type="PackedScene" id=2] + +[node name="VBoxContainer" type="VBoxContainer"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 1 +size_flags_horizontal = 0 +size_flags_vertical = 0 +alignment = 0 + +[node name="HBoxContainer" type="HBoxContainer" parent="."] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 512.0 +margin_bottom = 254.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 0 + +[node name="ViewportContainer" type="ViewportContainer" parent="HBoxContainer"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 254.0 +margin_bottom = 254.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +stretch = true +stretch_shrink = 1 +script = ExtResource( 1 ) +target = NodePath("Viewport/Spatial/MeshInstance") +min_scale = 0.1 +max_scale = 3.0 +one_finger_rot_x = true +one_finger_rot_y = false +two_fingers_rot_z = false +two_fingers_zoom = false + +[node name="Viewport" type="Viewport" parent="HBoxContainer/ViewportContainer"] + +arvr = false +size = Vector2( 254, 254 ) +own_world = true +world = null +transparent_bg = true +msaa = 0 +hdr = false +disable_3d = false +usage = 2 +debug_draw = 0 +render_target_v_flip = false +render_target_clear_mode = 0 +render_target_update_mode = 3 +audio_listener_enable_2d = false +audio_listener_enable_3d = false +physics_object_picking = false +gui_disable_input = false +gui_snap_controls_to_pixels = true +shadow_atlas_size = 0 +shadow_atlas_quad_0 = 2 +shadow_atlas_quad_1 = 2 +shadow_atlas_quad_2 = 3 +shadow_atlas_quad_3 = 4 + +[node name="Spatial" parent="HBoxContainer/ViewportContainer/Viewport" instance=ExtResource( 2 )] + +[node name="DirectionalLight" parent="HBoxContainer/ViewportContainer/Viewport/Spatial"] + +light_cull_mask = -1 + +[node name="Camera" parent="HBoxContainer/ViewportContainer/Viewport/Spatial"] + +current = true + +[node name="Label" type="Label" parent="HBoxContainer/ViewportContainer"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 7.0 +margin_top = 11.0 +margin_right = 157.0 +margin_bottom = 25.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "One-finger rot around X" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + +[node name="ViewportContainer2" type="ViewportContainer" parent="HBoxContainer"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 258.0 +margin_right = 512.0 +margin_bottom = 254.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +stretch = true +stretch_shrink = 1 +script = ExtResource( 1 ) +target = NodePath("Viewport/Spatial/MeshInstance") +min_scale = 0.1 +max_scale = 3.0 +one_finger_rot_x = true +one_finger_rot_y = true +two_fingers_rot_z = false +two_fingers_zoom = false + +[node name="Viewport" type="Viewport" parent="HBoxContainer/ViewportContainer2"] + +arvr = false +size = Vector2( 254, 254 ) +own_world = true +world = null +transparent_bg = true +msaa = 0 +hdr = false +disable_3d = false +usage = 2 +debug_draw = 0 +render_target_v_flip = false +render_target_clear_mode = 0 +render_target_update_mode = 3 +audio_listener_enable_2d = false +audio_listener_enable_3d = false +physics_object_picking = false +gui_disable_input = false +gui_snap_controls_to_pixels = true +shadow_atlas_size = 0 +shadow_atlas_quad_0 = 2 +shadow_atlas_quad_1 = 2 +shadow_atlas_quad_2 = 3 +shadow_atlas_quad_3 = 4 + +[node name="Spatial" parent="HBoxContainer/ViewportContainer2/Viewport" instance=ExtResource( 2 )] + +[node name="DirectionalLight" parent="HBoxContainer/ViewportContainer2/Viewport/Spatial"] + +light_cull_mask = -1 + +[node name="Camera" parent="HBoxContainer/ViewportContainer2/Viewport/Spatial"] + +current = true + +[node name="Label2" type="Label" parent="HBoxContainer/ViewportContainer2"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 8.0 +margin_top = 11.0 +margin_right = 196.0 +margin_bottom = 25.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "One-finger rot around X and Y" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + +[node name="HBoxContainer2" type="HBoxContainer" parent="."] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 258.0 +margin_right = 512.0 +margin_bottom = 512.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 0 + +[node name="ViewportContainer" type="ViewportContainer" parent="HBoxContainer2"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 254.0 +margin_bottom = 254.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +stretch = true +stretch_shrink = 1 +script = ExtResource( 1 ) +target = NodePath("Viewport/Spatial/MeshInstance") +min_scale = 0.1 +max_scale = 3.0 +one_finger_rot_x = true +one_finger_rot_y = true +two_fingers_rot_z = true +two_fingers_zoom = false + +[node name="Viewport" type="Viewport" parent="HBoxContainer2/ViewportContainer"] + +arvr = false +size = Vector2( 254, 254 ) +own_world = true +world = null +transparent_bg = true +msaa = 0 +hdr = false +disable_3d = false +usage = 2 +debug_draw = 0 +render_target_v_flip = false +render_target_clear_mode = 0 +render_target_update_mode = 3 +audio_listener_enable_2d = false +audio_listener_enable_3d = false +physics_object_picking = false +gui_disable_input = false +gui_snap_controls_to_pixels = true +shadow_atlas_size = 0 +shadow_atlas_quad_0 = 2 +shadow_atlas_quad_1 = 2 +shadow_atlas_quad_2 = 3 +shadow_atlas_quad_3 = 4 + +[node name="Spatial" parent="HBoxContainer2/ViewportContainer/Viewport" instance=ExtResource( 2 )] + +[node name="DirectionalLight" parent="HBoxContainer2/ViewportContainer/Viewport/Spatial"] + +light_cull_mask = -1 + +[node name="Camera" parent="HBoxContainer2/ViewportContainer/Viewport/Spatial"] + +current = true + +[node name="Label3" type="Label" parent="HBoxContainer2/ViewportContainer"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 8.0 +margin_top = 9.0 +margin_right = 236.0 +margin_bottom = 23.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "One-finger X/Y rot + two-finger Z rot" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + +[node name="ViewportContainer2" type="ViewportContainer" parent="HBoxContainer2"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 258.0 +margin_right = 512.0 +margin_bottom = 254.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +stretch = true +stretch_shrink = 1 +script = ExtResource( 1 ) +target = NodePath("Viewport/Spatial/MeshInstance") +min_scale = 0.1 +max_scale = 3.0 +one_finger_rot_x = true +one_finger_rot_y = true +two_fingers_rot_z = true +two_fingers_zoom = true + +[node name="Viewport" type="Viewport" parent="HBoxContainer2/ViewportContainer2"] + +arvr = false +size = Vector2( 254, 254 ) +own_world = true +world = null +transparent_bg = true +msaa = 0 +hdr = false +disable_3d = false +usage = 2 +debug_draw = 0 +render_target_v_flip = false +render_target_clear_mode = 0 +render_target_update_mode = 3 +audio_listener_enable_2d = false +audio_listener_enable_3d = false +physics_object_picking = false +gui_disable_input = false +gui_snap_controls_to_pixels = true +shadow_atlas_size = 0 +shadow_atlas_quad_0 = 2 +shadow_atlas_quad_1 = 2 +shadow_atlas_quad_2 = 3 +shadow_atlas_quad_3 = 4 + +[node name="Spatial" parent="HBoxContainer2/ViewportContainer2/Viewport" instance=ExtResource( 2 )] + +[node name="DirectionalLight" parent="HBoxContainer2/ViewportContainer2/Viewport/Spatial"] + +light_cull_mask = -1 + +[node name="Camera" parent="HBoxContainer2/ViewportContainer2/Viewport/Spatial"] + +current = true + +[node name="Label2" type="Label" parent="HBoxContainer2/ViewportContainer2"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 12.0 +margin_top = 9.0 +margin_right = 279.0 +margin_bottom = 23.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "One-finger X/Y, two-finger Z + pinch" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + + +[editable path="HBoxContainer/ViewportContainer/Viewport/Spatial"] +[editable path="HBoxContainer/ViewportContainer2/Viewport/Spatial"] +[editable path="HBoxContainer2/ViewportContainer/Viewport/Spatial"] +[editable path="HBoxContainer2/ViewportContainer2/Viewport/Spatial"] diff --git a/misc/multitouch_cubes/default_env.tres b/misc/multitouch_cubes/default_env.tres new file mode 100644 index 00000000..03504276 --- /dev/null +++ b/misc/multitouch_cubes/default_env.tres @@ -0,0 +1,80 @@ +[gd_resource type="Environment" format=2] + +[resource] + +background_mode = 0 +background_sky_custom_fov = 0.0 +background_color = Color( 0, 0, 0, 1 ) +background_energy = 1.0 +background_canvas_max_layer = 0 +ambient_light_color = Color( 0.307434, 0.362682, 0.539063, 1 ) +ambient_light_energy = 1.0 +ambient_light_sky_contribution = 1.0 +fog_enabled = false +fog_color = Color( 0.5, 0.6, 0.7, 1 ) +fog_sun_color = Color( 1, 0.9, 0.7, 1 ) +fog_sun_amount = 0.0 +fog_depth_enabled = true +fog_depth_begin = 10.0 +fog_depth_curve = 1.0 +fog_transmit_enabled = false +fog_transmit_curve = 1.0 +fog_height_enabled = false +fog_height_min = 0.0 +fog_height_max = 100.0 +fog_height_curve = 1.0 +tonemap_mode = 0 +tonemap_exposure = 1.0 +tonemap_white = 1.0 +auto_exposure_enabled = false +auto_exposure_scale = 0.4 +auto_exposure_min_luma = 0.05 +auto_exposure_max_luma = 8.0 +auto_exposure_speed = 0.5 +ss_reflections_enabled = false +ss_reflections_max_steps = 64 +ss_reflections_fade_in = 0.15 +ss_reflections_fade_out = 2.0 +ss_reflections_depth_tolerance = 0.2 +ss_reflections_roughness = true +ssao_enabled = false +ssao_radius = 1.0 +ssao_intensity = 1.0 +ssao_radius2 = 0.0 +ssao_intensity2 = 1.0 +ssao_bias = 0.01 +ssao_light_affect = 0.0 +ssao_color = Color( 0, 0, 0, 1 ) +ssao_quality = 0 +ssao_blur = 3 +ssao_edge_sharpness = 4.0 +dof_blur_far_enabled = false +dof_blur_far_distance = 10.0 +dof_blur_far_transition = 5.0 +dof_blur_far_amount = 0.1 +dof_blur_far_quality = 1 +dof_blur_near_enabled = false +dof_blur_near_distance = 2.0 +dof_blur_near_transition = 1.0 +dof_blur_near_amount = 0.1 +dof_blur_near_quality = 1 +glow_enabled = false +glow_levels/1 = false +glow_levels/2 = false +glow_levels/3 = true +glow_levels/4 = false +glow_levels/5 = true +glow_levels/6 = false +glow_levels/7 = false +glow_intensity = 0.8 +glow_strength = 1.0 +glow_bloom = 0.0 +glow_blend_mode = 2 +glow_hdr_threshold = 1.0 +glow_hdr_scale = 2.0 +glow_bicubic_upscale = false +adjustment_enabled = false +adjustment_brightness = 1.0 +adjustment_contrast = 1.0 +adjustment_saturation = 1.0 + diff --git a/misc/multitouch_cubes/icon.png b/misc/multitouch_cubes/icon.png new file mode 100644 index 00000000..d9404909 Binary files /dev/null and b/misc/multitouch_cubes/icon.png differ diff --git a/misc/multitouch_cubes/project.godot b/misc/multitouch_cubes/project.godot new file mode 100644 index 00000000..d67fd905 --- /dev/null +++ b/misc/multitouch_cubes/project.godot @@ -0,0 +1,24 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=3 + +[application] + +config/name="InteractiveCubes" +run/main_scene="res://Main.tscn" +config/icon="res://icon.png" + +[gdnative] + +singletons=[ ] + +[rendering] + +environment/default_clear_color=Color( 0.113725, 0.133333, 0.196078, 1 ) +environment/default_environment="res://default_env.tres" diff --git a/misc/multitouch_view/Main.gd b/misc/multitouch_view/Main.gd new file mode 100644 index 00000000..1ccad7c8 --- /dev/null +++ b/misc/multitouch_view/Main.gd @@ -0,0 +1,20 @@ +extends Node2D + +func _process(delta): + # To keep redrawing on every frame + update() + +func _draw(): + # Get the touch helper singleton + var touch_helper = get_node("/root/TouchHelper") + # Draw every pointer as a circle + for ptr_id in touch_helper.state.keys(): + var pos = touch_helper.state[ptr_id] + var color = _get_color_for_ptr_id(ptr_id) + color.a = 0.75 + draw_circle(pos, 40.0, color) + +# Just a way of getting different colors +func _get_color_for_ptr_id(id): + var x = (id % 7) + 1 + return Color(float(bool(x & 1)), float(bool(x & 2)), float(bool(x & 4))) diff --git a/misc/multitouch_view/Main.tscn b/misc/multitouch_view/Main.tscn new file mode 100644 index 00000000..517e34e5 --- /dev/null +++ b/misc/multitouch_view/Main.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Main.gd" type="Script" id=1] + +[node name="Main" type="Node2D"] + +script = ExtResource( 1 ) + + diff --git a/misc/multitouch_view/TouchHelper.gd b/misc/multitouch_view/TouchHelper.gd new file mode 100644 index 00000000..5abf271d --- /dev/null +++ b/misc/multitouch_view/TouchHelper.gd @@ -0,0 +1,43 @@ +# This will track the position of every pointer in its public `state` property, which is a +# Dictionary, in which each key is a pointer id (integer) and each value its position (Vector2). +# It works by listening to input events not handled by other means. +# It also remaps the pointer indices coming from the OS to the lowest available to be friendlier. +# It can be conveniently setup as a singleton. + +extends Node + +var state = {} +var _os2own = {} + +func _unhandled_input(event): + if event is InputEventScreenTouch: + if event.pressed: + # Down + if !_os2own.has(event.index): # Defensively discard index if already known + var ptr_id = _find_free_pointer_id() + state[ptr_id] = event.position + _os2own[event.index] = ptr_id + else: + # Up + if _os2own.has(event.index): # Defensively discard index if not known + var ptr_id = _os2own[event.index] + state.erase(ptr_id) + _os2own.erase(event.index) + return true + + elif event is InputEventScreenDrag: + # Move + if _os2own.has(event.index): # Defensively discard index if not known + var ptr_id = _os2own[event.index] + state[ptr_id] = event.position + return true + + return false + +func _find_free_pointer_id(): + var used = state.keys() + var i = 0 + while i in used: + i += 1 + return i + diff --git a/misc/multitouch_view/default_env.tres b/misc/multitouch_view/default_env.tres new file mode 100644 index 00000000..ad86b722 --- /dev/null +++ b/misc/multitouch_view/default_env.tres @@ -0,0 +1,101 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +radiance_size = 4 +sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 ) +sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 ) +sky_curve = 0.25 +sky_energy = 1.0 +ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 ) +ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 ) +ground_curve = 0.01 +ground_energy = 1.0 +sun_color = Color( 1, 1, 1, 1 ) +sun_latitude = 35.0 +sun_longitude = 0.0 +sun_angle_min = 1.0 +sun_angle_max = 100.0 +sun_curve = 0.05 +sun_energy = 16.0 +texture_size = 2 + +[resource] + +background_mode = 2 +background_sky = SubResource( 1 ) +background_sky_custom_fov = 0.0 +background_color = Color( 0, 0, 0, 1 ) +background_energy = 1.0 +background_canvas_max_layer = 0 +ambient_light_color = Color( 0, 0, 0, 1 ) +ambient_light_energy = 1.0 +ambient_light_sky_contribution = 1.0 +fog_enabled = false +fog_color = Color( 0.5, 0.6, 0.7, 1 ) +fog_sun_color = Color( 1, 0.9, 0.7, 1 ) +fog_sun_amount = 0.0 +fog_depth_enabled = true +fog_depth_begin = 10.0 +fog_depth_curve = 1.0 +fog_transmit_enabled = false +fog_transmit_curve = 1.0 +fog_height_enabled = false +fog_height_min = 0.0 +fog_height_max = 100.0 +fog_height_curve = 1.0 +tonemap_mode = 0 +tonemap_exposure = 1.0 +tonemap_white = 1.0 +auto_exposure_enabled = false +auto_exposure_scale = 0.4 +auto_exposure_min_luma = 0.05 +auto_exposure_max_luma = 8.0 +auto_exposure_speed = 0.5 +ss_reflections_enabled = false +ss_reflections_max_steps = 64 +ss_reflections_fade_in = 0.15 +ss_reflections_fade_out = 2.0 +ss_reflections_depth_tolerance = 0.2 +ss_reflections_roughness = true +ssao_enabled = false +ssao_radius = 1.0 +ssao_intensity = 1.0 +ssao_radius2 = 0.0 +ssao_intensity2 = 1.0 +ssao_bias = 0.01 +ssao_light_affect = 0.0 +ssao_color = Color( 0, 0, 0, 1 ) +ssao_quality = 0 +ssao_blur = 3 +ssao_edge_sharpness = 4.0 +dof_blur_far_enabled = false +dof_blur_far_distance = 10.0 +dof_blur_far_transition = 5.0 +dof_blur_far_amount = 0.1 +dof_blur_far_quality = 1 +dof_blur_near_enabled = false +dof_blur_near_distance = 2.0 +dof_blur_near_transition = 1.0 +dof_blur_near_amount = 0.1 +dof_blur_near_quality = 1 +glow_enabled = false +glow_levels/1 = false +glow_levels/2 = false +glow_levels/3 = true +glow_levels/4 = false +glow_levels/5 = true +glow_levels/6 = false +glow_levels/7 = false +glow_intensity = 0.8 +glow_strength = 1.0 +glow_bloom = 0.0 +glow_blend_mode = 2 +glow_hdr_threshold = 1.0 +glow_hdr_scale = 2.0 +glow_bicubic_upscale = false +adjustment_enabled = false +adjustment_brightness = 1.0 +adjustment_contrast = 1.0 +adjustment_saturation = 1.0 + diff --git a/misc/multitouch_view/icon.png b/misc/multitouch_view/icon.png new file mode 100644 index 00000000..4daacd5b Binary files /dev/null and b/misc/multitouch_view/icon.png differ diff --git a/misc/multitouch_view/project.godot b/misc/multitouch_view/project.godot new file mode 100644 index 00000000..4331a85f --- /dev/null +++ b/misc/multitouch_view/project.godot @@ -0,0 +1,28 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=3 + +[application] + +config/name="TouchesView" +run/main_scene="res://Main.tscn" +config/icon="res://icon.png" + +[autoload] + +TouchHelper="*res://TouchHelper.gd" + +[gdnative] + +singletons=[ ] + +[rendering] + +environment/default_clear_color=Color( 0.113725, 0.133333, 0.196078, 1 ) +environment/default_environment="res://default_env.tres" diff --git a/visual_script/circle_pop/Circle.tscn b/visual_script/circle_pop/Circle.tscn new file mode 100644 index 00000000..bcb46b19 --- /dev/null +++ b/visual_script/circle_pop/Circle.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://white-circle.png" type="Texture" id=1] +[ext_resource path="res://CircleArea.vs" type="Script" id=2] + +[sub_resource type="CanvasItemMaterial" id=1] + +render_priority = 0 +blend_mode = 1 +light_mode = 0 + +[sub_resource type="CircleShape2D" id=2] + +custom_solver_bias = 0.0 +radius = 128.0 + +[node name="Sprite" type="Sprite"] + +material = SubResource( 1 ) +texture = ExtResource( 1 ) + +[node name="Area2D" type="Area2D" parent="."] + +input_pickable = true +gravity_vec = Vector2( 0, 1 ) +gravity = 98.0 +linear_damp = 0.1 +angular_damp = 1.0 +audio_bus_override = false +audio_bus_name = "Master" +script = ExtResource( 2 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] + +shape = SubResource( 2 ) + + diff --git a/visual_script/circle_pop/CircleArea.vs b/visual_script/circle_pop/CircleArea.vs new file mode 100644 index 00000000..062ee8f8 Binary files /dev/null and b/visual_script/circle_pop/CircleArea.vs differ diff --git a/visual_script/circle_pop/Main.tscn b/visual_script/circle_pop/Main.tscn new file mode 100644 index 00000000..43806fb6 --- /dev/null +++ b/visual_script/circle_pop/Main.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Main.vs" type="Script" id=1] + +[node name="Main" type="Node2D"] + +script = ExtResource( 1 ) + +[node name="Timer" type="Timer" parent="."] + +process_mode = 1 +wait_time = 1.0 +one_shot = false +autostart = true + +[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] + + diff --git a/visual_script/circle_pop/Main.vs b/visual_script/circle_pop/Main.vs new file mode 100644 index 00000000..7188439a Binary files /dev/null and b/visual_script/circle_pop/Main.vs differ diff --git a/visual_script/circle_pop/default_env.tres b/visual_script/circle_pop/default_env.tres new file mode 100644 index 00000000..ad86b722 --- /dev/null +++ b/visual_script/circle_pop/default_env.tres @@ -0,0 +1,101 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +radiance_size = 4 +sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 ) +sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 ) +sky_curve = 0.25 +sky_energy = 1.0 +ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 ) +ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 ) +ground_curve = 0.01 +ground_energy = 1.0 +sun_color = Color( 1, 1, 1, 1 ) +sun_latitude = 35.0 +sun_longitude = 0.0 +sun_angle_min = 1.0 +sun_angle_max = 100.0 +sun_curve = 0.05 +sun_energy = 16.0 +texture_size = 2 + +[resource] + +background_mode = 2 +background_sky = SubResource( 1 ) +background_sky_custom_fov = 0.0 +background_color = Color( 0, 0, 0, 1 ) +background_energy = 1.0 +background_canvas_max_layer = 0 +ambient_light_color = Color( 0, 0, 0, 1 ) +ambient_light_energy = 1.0 +ambient_light_sky_contribution = 1.0 +fog_enabled = false +fog_color = Color( 0.5, 0.6, 0.7, 1 ) +fog_sun_color = Color( 1, 0.9, 0.7, 1 ) +fog_sun_amount = 0.0 +fog_depth_enabled = true +fog_depth_begin = 10.0 +fog_depth_curve = 1.0 +fog_transmit_enabled = false +fog_transmit_curve = 1.0 +fog_height_enabled = false +fog_height_min = 0.0 +fog_height_max = 100.0 +fog_height_curve = 1.0 +tonemap_mode = 0 +tonemap_exposure = 1.0 +tonemap_white = 1.0 +auto_exposure_enabled = false +auto_exposure_scale = 0.4 +auto_exposure_min_luma = 0.05 +auto_exposure_max_luma = 8.0 +auto_exposure_speed = 0.5 +ss_reflections_enabled = false +ss_reflections_max_steps = 64 +ss_reflections_fade_in = 0.15 +ss_reflections_fade_out = 2.0 +ss_reflections_depth_tolerance = 0.2 +ss_reflections_roughness = true +ssao_enabled = false +ssao_radius = 1.0 +ssao_intensity = 1.0 +ssao_radius2 = 0.0 +ssao_intensity2 = 1.0 +ssao_bias = 0.01 +ssao_light_affect = 0.0 +ssao_color = Color( 0, 0, 0, 1 ) +ssao_quality = 0 +ssao_blur = 3 +ssao_edge_sharpness = 4.0 +dof_blur_far_enabled = false +dof_blur_far_distance = 10.0 +dof_blur_far_transition = 5.0 +dof_blur_far_amount = 0.1 +dof_blur_far_quality = 1 +dof_blur_near_enabled = false +dof_blur_near_distance = 2.0 +dof_blur_near_transition = 1.0 +dof_blur_near_amount = 0.1 +dof_blur_near_quality = 1 +glow_enabled = false +glow_levels/1 = false +glow_levels/2 = false +glow_levels/3 = true +glow_levels/4 = false +glow_levels/5 = true +glow_levels/6 = false +glow_levels/7 = false +glow_intensity = 0.8 +glow_strength = 1.0 +glow_bloom = 0.0 +glow_blend_mode = 2 +glow_hdr_threshold = 1.0 +glow_hdr_scale = 2.0 +glow_bicubic_upscale = false +adjustment_enabled = false +adjustment_brightness = 1.0 +adjustment_contrast = 1.0 +adjustment_saturation = 1.0 + diff --git a/visual_script/circle_pop/icon.png b/visual_script/circle_pop/icon.png new file mode 100644 index 00000000..8a8e4526 Binary files /dev/null and b/visual_script/circle_pop/icon.png differ diff --git a/visual_script/circle_pop/project.godot b/visual_script/circle_pop/project.godot new file mode 100644 index 00000000..40839a70 --- /dev/null +++ b/visual_script/circle_pop/project.godot @@ -0,0 +1,24 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=3 + +[application] + +config/name="CirclePop" +run/main_scene="res://Main.tscn" +config/icon="res://icon.png" + +[gdnative] + +singletons=[ ] + +[rendering] + +environment/default_clear_color=Color( 0.113725, 0.133333, 0.196078, 1 ) +environment/default_environment="res://default_env.tres" diff --git a/visual_script/circle_pop/white-circle.png b/visual_script/circle_pop/white-circle.png new file mode 100644 index 00000000..dce46743 Binary files /dev/null and b/visual_script/circle_pop/white-circle.png differ diff --git a/visual_script/multitouch_view/Main.tscn b/visual_script/multitouch_view/Main.tscn new file mode 100644 index 00000000..a1567818 --- /dev/null +++ b/visual_script/multitouch_view/Main.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Main.vs" type="Script" id=1] + +[node name="Main" type="Node2D"] + +script = ExtResource( 1 ) + + diff --git a/visual_script/multitouch_view/Main.vs b/visual_script/multitouch_view/Main.vs new file mode 100644 index 00000000..39c6ef70 Binary files /dev/null and b/visual_script/multitouch_view/Main.vs differ diff --git a/visual_script/multitouch_view/TouchHelper.gd b/visual_script/multitouch_view/TouchHelper.gd new file mode 100644 index 00000000..5abf271d --- /dev/null +++ b/visual_script/multitouch_view/TouchHelper.gd @@ -0,0 +1,43 @@ +# This will track the position of every pointer in its public `state` property, which is a +# Dictionary, in which each key is a pointer id (integer) and each value its position (Vector2). +# It works by listening to input events not handled by other means. +# It also remaps the pointer indices coming from the OS to the lowest available to be friendlier. +# It can be conveniently setup as a singleton. + +extends Node + +var state = {} +var _os2own = {} + +func _unhandled_input(event): + if event is InputEventScreenTouch: + if event.pressed: + # Down + if !_os2own.has(event.index): # Defensively discard index if already known + var ptr_id = _find_free_pointer_id() + state[ptr_id] = event.position + _os2own[event.index] = ptr_id + else: + # Up + if _os2own.has(event.index): # Defensively discard index if not known + var ptr_id = _os2own[event.index] + state.erase(ptr_id) + _os2own.erase(event.index) + return true + + elif event is InputEventScreenDrag: + # Move + if _os2own.has(event.index): # Defensively discard index if not known + var ptr_id = _os2own[event.index] + state[ptr_id] = event.position + return true + + return false + +func _find_free_pointer_id(): + var used = state.keys() + var i = 0 + while i in used: + i += 1 + return i + diff --git a/visual_script/multitouch_view/default_env.tres b/visual_script/multitouch_view/default_env.tres new file mode 100644 index 00000000..ad86b722 --- /dev/null +++ b/visual_script/multitouch_view/default_env.tres @@ -0,0 +1,101 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +radiance_size = 4 +sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 ) +sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 ) +sky_curve = 0.25 +sky_energy = 1.0 +ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 ) +ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 ) +ground_curve = 0.01 +ground_energy = 1.0 +sun_color = Color( 1, 1, 1, 1 ) +sun_latitude = 35.0 +sun_longitude = 0.0 +sun_angle_min = 1.0 +sun_angle_max = 100.0 +sun_curve = 0.05 +sun_energy = 16.0 +texture_size = 2 + +[resource] + +background_mode = 2 +background_sky = SubResource( 1 ) +background_sky_custom_fov = 0.0 +background_color = Color( 0, 0, 0, 1 ) +background_energy = 1.0 +background_canvas_max_layer = 0 +ambient_light_color = Color( 0, 0, 0, 1 ) +ambient_light_energy = 1.0 +ambient_light_sky_contribution = 1.0 +fog_enabled = false +fog_color = Color( 0.5, 0.6, 0.7, 1 ) +fog_sun_color = Color( 1, 0.9, 0.7, 1 ) +fog_sun_amount = 0.0 +fog_depth_enabled = true +fog_depth_begin = 10.0 +fog_depth_curve = 1.0 +fog_transmit_enabled = false +fog_transmit_curve = 1.0 +fog_height_enabled = false +fog_height_min = 0.0 +fog_height_max = 100.0 +fog_height_curve = 1.0 +tonemap_mode = 0 +tonemap_exposure = 1.0 +tonemap_white = 1.0 +auto_exposure_enabled = false +auto_exposure_scale = 0.4 +auto_exposure_min_luma = 0.05 +auto_exposure_max_luma = 8.0 +auto_exposure_speed = 0.5 +ss_reflections_enabled = false +ss_reflections_max_steps = 64 +ss_reflections_fade_in = 0.15 +ss_reflections_fade_out = 2.0 +ss_reflections_depth_tolerance = 0.2 +ss_reflections_roughness = true +ssao_enabled = false +ssao_radius = 1.0 +ssao_intensity = 1.0 +ssao_radius2 = 0.0 +ssao_intensity2 = 1.0 +ssao_bias = 0.01 +ssao_light_affect = 0.0 +ssao_color = Color( 0, 0, 0, 1 ) +ssao_quality = 0 +ssao_blur = 3 +ssao_edge_sharpness = 4.0 +dof_blur_far_enabled = false +dof_blur_far_distance = 10.0 +dof_blur_far_transition = 5.0 +dof_blur_far_amount = 0.1 +dof_blur_far_quality = 1 +dof_blur_near_enabled = false +dof_blur_near_distance = 2.0 +dof_blur_near_transition = 1.0 +dof_blur_near_amount = 0.1 +dof_blur_near_quality = 1 +glow_enabled = false +glow_levels/1 = false +glow_levels/2 = false +glow_levels/3 = true +glow_levels/4 = false +glow_levels/5 = true +glow_levels/6 = false +glow_levels/7 = false +glow_intensity = 0.8 +glow_strength = 1.0 +glow_bloom = 0.0 +glow_blend_mode = 2 +glow_hdr_threshold = 1.0 +glow_hdr_scale = 2.0 +glow_bicubic_upscale = false +adjustment_enabled = false +adjustment_brightness = 1.0 +adjustment_contrast = 1.0 +adjustment_saturation = 1.0 + diff --git a/visual_script/multitouch_view/icon.png b/visual_script/multitouch_view/icon.png new file mode 100644 index 00000000..4daacd5b Binary files /dev/null and b/visual_script/multitouch_view/icon.png differ diff --git a/visual_script/multitouch_view/project.godot b/visual_script/multitouch_view/project.godot new file mode 100644 index 00000000..4331a85f --- /dev/null +++ b/visual_script/multitouch_view/project.godot @@ -0,0 +1,28 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=3 + +[application] + +config/name="TouchesView" +run/main_scene="res://Main.tscn" +config/icon="res://icon.png" + +[autoload] + +TouchHelper="*res://TouchHelper.gd" + +[gdnative] + +singletons=[ ] + +[rendering] + +environment/default_clear_color=Color( 0.113725, 0.133333, 0.196078, 1 ) +environment/default_environment="res://default_env.tres"