acb7f21a80929f7616a6123ac290f262164080a8 — Drew DeVault 5 months ago 7d52a0b
threeston: initial commit
A threeston/LICENSE => threeston/LICENSE +21 -0
@@ 0,0 1,21 @@
+MIT License
+
+Copyright (c) 2019 dgilmarj
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

A threeston/README.md => threeston/README.md +1 -0
@@ 0,0 1,1 @@
+# godot-first-person-character<
\ No newline at end of file

A threeston/default_env.tres => threeston/default_env.tres +9 -0
@@ 0,0 1,9 @@
+[gd_resource type="Environment" load_steps=2 format=2]
+
+[sub_resource type="ProceduralSky" id=1]
+
+[resource]
+background_mode = 2
+background_sky = SubResource( 1 )
+ambient_light_color = Color( 1, 1, 1, 1 )
+ambient_light_energy = 3.91

A threeston/icon.png => threeston/icon.png +0 -0

A threeston/icon.png.import => threeston/icon.png.import +34 -0
@@ 0,0 1,34 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
+
+[params]
+
+compress/mode=0
+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=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0

A threeston/icon_fpc.PNG => threeston/icon_fpc.PNG +0 -0

A threeston/icon_fpc.PNG.import => threeston/icon_fpc.PNG.import +34 -0
@@ 0,0 1,34 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icon_fpc.PNG-a20822e59310bdd1c8e658e960ec81ca.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon_fpc.PNG"
+dest_files=[ "res://.import/icon_fpc.PNG-a20822e59310bdd1c8e658e960ec81ca.stex" ]
+
+[params]
+
+compress/mode=0
+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=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0

A threeston/prefabs/environment/Environment.tscn => threeston/prefabs/environment/Environment.tscn +25 -0
@@ 0,0 1,25 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://prefabs/environment/chess_texture.png" type="Texture" id=1]
+
+[sub_resource type="PlaneMesh" id=1]
+size = Vector2( 100, 100 )
+
+[sub_resource type="SpatialMaterial" id=2]
+albedo_texture = ExtResource( 1 )
+metallic_specular = 0.03
+
+[sub_resource type="BoxShape" id=3]
+extents = Vector3( 50, 1, 50 )
+
+[node name="Environment" type="Spatial"]
+
+[node name="floor" type="StaticBody" parent="."]
+
+[node name="MeshInstance" type="MeshInstance" parent="floor"]
+mesh = SubResource( 1 )
+material/0 = SubResource( 2 )
+
+[node name="CollisionShape" type="CollisionShape" parent="floor"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0 )
+shape = SubResource( 3 )

A threeston/prefabs/environment/chess_texture.png => threeston/prefabs/environment/chess_texture.png +0 -0

A threeston/prefabs/environment/chess_texture.png.import => threeston/prefabs/environment/chess_texture.png.import +36 -0
@@ 0,0 1,36 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/chess_texture.png-b9a4de8e47b1ee422f356d65d924b1fb.s3tc.stex"
+path.etc2="res://.import/chess_texture.png-b9a4de8e47b1ee422f356d65d924b1fb.etc2.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://prefabs/environment/chess_texture.png"
+dest_files=[ "res://.import/chess_texture.png-b9a4de8e47b1ee422f356d65d924b1fb.s3tc.stex", "res://.import/chess_texture.png-b9a4de8e47b1ee422f356d65d924b1fb.etc2.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+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
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0

A threeston/prefabs/first_person_controller/First_Person.gd => threeston/prefabs/first_person_controller/First_Person.gd +76 -0
@@ 0,0 1,76 @@
+extends KinematicBody
+
+#constants
+const GRAVITY = 9.8
+
+#mouse sensitivity
+export(float,0.1,1.0) var sensitivity_x = 0.5
+export(float,0.1,1.0) var sensitivity_y = 0.4
+
+#physics
+export(float,10.0, 30.0) var speed = 15.0
+export(float,10.0, 50.0) var jump_height = 25
+export(float,1.0, 10.0) var mass = 8.0
+export(float,0.1, 3.0, 0.1) var gravity_scl = 1.0
+
+#instances ref
+onready var player_cam = $Camera
+onready var ground_ray = $GroundRay
+
+#variables
+var mouse_motion = Vector2()
+var gravity_speed = 0
+
+func _ready():
+	Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+	ground_ray.enabled = true
+	pass
+
+
+func _physics_process(delta):
+	
+	#camera and body rotation
+	rotate_y(deg2rad(20)* - mouse_motion.x * sensitivity_x * delta)
+	player_cam.rotate_x(deg2rad(20) * - mouse_motion.y * sensitivity_y * delta)
+	player_cam.rotation.x = clamp(player_cam.rotation.x, deg2rad(-47), deg2rad(47))
+	mouse_motion = Vector2()
+	
+	#gravity
+	gravity_speed -= GRAVITY * gravity_scl * mass * delta
+	
+	#character moviment
+	var velocity = Vector3()
+	velocity = _axis() * speed
+	velocity.y = gravity_speed
+	
+	#jump
+	if Input.is_action_just_pressed("space") and ground_ray.is_colliding():
+		velocity.y = jump_height
+	
+	gravity_speed = move_and_slide(velocity).y
+	
+	pass
+
+
+func _input(event):
+	
+	if event is InputEventMouseMotion:
+		mouse_motion = event.relative
+
+
+func _axis():
+	var direction = Vector3()
+	
+	if Input.is_key_pressed(KEY_W):
+		direction -= get_global_transform().basis.z.normalized()
+		
+	if Input.is_key_pressed(KEY_S):
+		direction += get_global_transform().basis.z.normalized()
+		
+	if Input.is_key_pressed(KEY_A):
+		direction -= get_global_transform().basis.x.normalized()
+		
+	if Input.is_key_pressed(KEY_D):
+		direction += get_global_transform().basis.x.normalized()
+		
+	return direction.normalized()<
\ No newline at end of file

A threeston/prefabs/first_person_controller/First_Person_Character.tscn => threeston/prefabs/first_person_controller/First_Person_Character.tscn +31 -0
@@ 0,0 1,31 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://prefabs/first_person_controller/First_Person.gd" type="Script" id=1]
+
+[sub_resource type="CubeMesh" id=1]
+
+size = Vector3( 1, 4, 1 )
+
+[sub_resource type="CapsuleShape" id=2]
+
+height = 2.0
+
+[node name="Character" type="KinematicBody"]
+script = ExtResource( 1 )
+
+[node name="mesh" type="MeshInstance" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0 )
+mesh = SubResource( 1 )
+material/0 = null
+
+[node name="Camera" type="Camera" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.4, 0 )
+
+[node name="CollisionShape" type="CollisionShape" parent="."]
+transform = Transform( 1, 0, 0, 0, -4.37114e-008, 1, 0, -1, -4.37114e-008, 0, 2, 0 )
+shape = SubResource( 2 )
+
+[node name="GroundRay" type="RayCast" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0 )
+enabled = true
+

A threeston/prefabs/player_demo/Player.gd => threeston/prefabs/player_demo/Player.gd +55 -0
@@ 0,0 1,55 @@
+extends KinematicBody
+
+#constants
+const GRAVITY = 9.8
+
+#mouse sensitivity
+export(float,0.1,1.0) var sensitivity_x = 0.5
+export(float,0.1,1.0) var sensitivity_y = 0.4
+
+#physics
+export(float,10.0, 30.0) var speed = 15.0
+export(float,10.0, 50.0) var jump_height = 25
+export(float,1.0, 10.0) var mass = 8.0
+export(float,0.1, 3.0, 0.1) var gravity_scl = 1.0
+
+#instances ref
+onready var player_cam = $Camera
+onready var ground_ray = $GroundRay
+
+#variables
+var mouse_motion = Vector2()
+var gravity_speed = 0
+
+func _ready():
+	ground_ray.enabled = true
+
+func _physics_process(delta):
+	rotate_y(deg2rad(20)* - mouse_motion.x * sensitivity_x * delta)
+	player_cam.rotate_x(deg2rad(20) * - mouse_motion.y * sensitivity_y * delta)
+	player_cam.rotation.x = clamp(player_cam.rotation.x, deg2rad(-47), deg2rad(47))
+	mouse_motion = Vector2()
+	
+	gravity_speed -= GRAVITY * gravity_scl * mass * delta
+	
+	var velocity = Vector3()
+	velocity = _axis() * speed
+	velocity.y = gravity_speed
+	
+	gravity_speed = move_and_slide(velocity).y
+
+func _input(event):
+	if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
+		mouse_motion = event.relative
+
+func _axis():
+	var direction = Vector3()
+	if Input.is_key_pressed(KEY_W):
+		direction -= get_global_transform().basis.z.normalized()
+	if Input.is_key_pressed(KEY_S):
+		direction += get_global_transform().basis.z.normalized()
+	if Input.is_key_pressed(KEY_A):
+		direction -= get_global_transform().basis.x.normalized()
+	if Input.is_key_pressed(KEY_D):
+		direction += get_global_transform().basis.x.normalized()
+	return direction.normalized()<
\ No newline at end of file

A threeston/prefabs/player_demo/Player.tscn => threeston/prefabs/player_demo/Player.tscn +20 -0
@@ 0,0 1,20 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://prefabs/player_demo/Player.gd" type="Script" id=1]
+
+[sub_resource type="CapsuleShape" id=2]
+height = 2.0
+
+[node name="Player" type="KinematicBody"]
+script = ExtResource( 1 )
+
+[node name="Camera" type="Camera" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.4, 0 )
+
+[node name="CollisionShape" type="CollisionShape" parent="."]
+transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 2, 0 )
+shape = SubResource( 2 )
+
+[node name="GroundRay" type="RayCast" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0 )
+enabled = true

A threeston/prefabs/player_demo/bullet_mat.tres => threeston/prefabs/player_demo/bullet_mat.tres +10 -0
@@ 0,0 1,10 @@
+[gd_resource type="SpatialMaterial" format=2]
+
+[resource]
+
+emission_enabled = true
+emission = Color( 1, 0.890196, 0, 1 )
+emission_energy = 1.0
+emission_operator = 0
+emission_on_uv2 = false
+

A threeston/prefabs/surface/Surface.gd => threeston/prefabs/surface/Surface.gd +37 -0
@@ 0,0 1,37 @@
+extends Spatial
+
+export var xdg_surface: WlrXdgSurface = null setget _xdg_surface_set
+
+signal map(surface)
+signal unmap(surface)
+
+func _xdg_surface_set(val):
+	$Viewport2D/SurfaceNode.xdg_surface = val
+	xdg_surface = val
+
+func _on_SurfaceNode_map(surface):
+	var state = xdg_surface.get_wlr_surface().get_current_state()
+	var size = Vector2(state.get_width(), state.get_height())
+	if $Viewport2D.get_size() != size:
+		$Viewport2D.set_size(size)
+		$Viewport2D.set_size_override(true, size)
+	emit_signal("map", self)
+	set_process(true)
+
+func _on_SurfaceNode_unmap(surface):
+	emit_signal("unmap", self)
+	set_process(false)
+
+func _process(delta):
+	if xdg_surface == null:
+		return
+	var surface = xdg_surface.get_wlr_surface()
+	if surface == null:
+		return
+	var state = surface.get_current_state()
+	var size = Vector2(state.get_width(), state.get_height())
+	if $Viewport2D.get_size() != size:
+		# TODO: This doesn't seem to work when resizing the viewport at runtime :<
+		$Viewport2D.set_size(size)
+		$Viewport2D.set_size_override(true, size)
+		print("Set viewport size", size)<
\ No newline at end of file

A threeston/prefabs/surface/Surface.tscn => threeston/prefabs/surface/Surface.tscn +24 -0
@@ 0,0 1,24 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://prefabs/surface/Surface_Node2D.gd" type="Script" id=1]
+[ext_resource path="res://prefabs/surface/Surface.gd" type="Script" id=2]
+
+[sub_resource type="ViewportTexture" id=1]
+viewport_path = NodePath("Viewport2D")
+
+[node name="Spatial" type="Spatial"]
+script = ExtResource( 2 )
+
+[node name="Viewport2D" type="Viewport" parent="."]
+size = Vector2( 512, 512 )
+transparent_bg = true
+usage = 0
+render_target_v_flip = true
+
+[node name="SurfaceNode" type="Node2D" parent="Viewport2D"]
+script = ExtResource( 1 )
+
+[node name="Sprite3D" type="Sprite3D" parent="."]
+texture = SubResource( 1 )
+[connection signal="map" from="Viewport2D/SurfaceNode" to="." method="_on_SurfaceNode_map"]
+[connection signal="unmap" from="Viewport2D/SurfaceNode" to="." method="_on_SurfaceNode_unmap"]

A threeston/prefabs/surface/Surface_Node2D.gd => threeston/prefabs/surface/Surface_Node2D.gd +45 -0
@@ 0,0 1,45 @@
+extends Node2D
+
+export var xdg_surface: WlrXdgSurface = null setget _xdg_surface_set
+var toplevel: WlrXdgToplevel
+
+signal map(surface)
+signal unmap(surface)
+
+func _xdg_surface_set(val):
+	if xdg_surface != null:
+		xdg_surface.disconnect("destroy", self, "_on_xdg_surface_destroy")
+		xdg_surface.disconnect("map", self, "_on_xdg_surface_map")
+		xdg_surface.disconnect("unmap", self, "_on_xdg_surface_unmap")
+	xdg_surface = val
+	xdg_surface.connect("destroy", self, "_on_xdg_surface_destroy")
+	xdg_surface.connect("map", self, "_on_xdg_surface_map")
+	xdg_surface.connect("unmap", self, "_on_xdg_surface_unmap")
+
+func _on_xdg_surface_destroy(xdg_surface):
+	pass # TODO
+	
+func _on_xdg_surface_map(xdg_surface):
+	set_process(true)
+	emit_signal("map", self)
+	
+func _on_xdg_surface_unmap(xdg_surface):
+	set_process(false)
+	emit_signal("unmap", self)
+
+func _process(delta):
+	update()
+
+func _draw_surface(surface, sx, sy):
+	var texture = surface.get_texture()
+	if texture == null:
+		return
+	draw_rect(get_viewport_rect(), Color.red)
+	var state = xdg_surface.get_wlr_surface().get_current_state()
+	draw_texture(texture, Vector2(0, 0))
+	surface.send_frame_done()
+
+func _draw():
+	if xdg_surface != null:
+		var fn = funcref(self, "_draw_surface")
+		xdg_surface.for_each_surface(fn)<
\ No newline at end of file

A threeston/project.godot => threeston/project.godot +43 -0
@@ 0,0 1,43 @@
+; 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=4
+
+_global_script_classes=[  ]
+_global_script_class_icons={
+
+}
+
+[application]
+
+config/name="First_Person_Character"
+run/main_scene="res://scenes/Main.tscn"
+config/icon="res://icon_fpc.PNG"
+
+[input]
+
+space={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
+ ]
+}
+fire={
+"deadzone": 0.5,
+"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null)
+ ]
+}
+reload={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"unicode":0,"echo":false,"script":null)
+ ]
+}
+
+[rendering]
+
+quality/driver/driver_name="GLES2"
+environment/default_environment="res://default_env.tres"

A threeston/scenes/Game_Manager.gd => threeston/scenes/Game_Manager.gd +38 -0
@@ 0,0 1,38 @@
+extends Node
+
+var Surface = load("res://prefabs/surface/Surface.tscn")
+
+onready var spawn_point = $Spawn_Point
+
+func _ready():
+	Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+	var display = $WaylandDisplay
+	display.run()
+
+func _input(event):
+	if Input.is_action_just_pressed("ui_cancel"):
+		Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
+	if Input.is_mouse_button_pressed(BUTTON_LEFT):
+		Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+
+func _on_Dead_Zone_body_entered(body):
+	body.translation = spawn_point.translation
+
+func _on_WlrXdgShell_new_surface(xdg_surface):
+	if xdg_surface.get_role() != WlrXdgSurface.XDG_SURFACE_ROLE_TOPLEVEL:
+		return
+	var surface = Surface.instance()
+	surface.xdg_surface = xdg_surface
+	surface.connect("map", self, "_on_surface_map")
+	surface.connect("unmap", self, "_on_surface_unmap")
+	var pos = $Player/Camera.to_global(Vector3(0, 0, -5))
+	surface.transform = (
+		Transform.translated(pos) *
+		Transform.rotated(Vector3(0, 1, 0), $Player.rotation.y) *
+		Transform.rotated(Vector3(1, 0, 0), $Player/Camera.rotation.x))
+
+func _on_surface_map(surface):
+	add_child(surface)
+	
+func _on_surface_unmap(surface):
+	remove_child(surface)<
\ No newline at end of file

A threeston/scenes/Main.tscn => threeston/scenes/Main.tscn +67 -0
@@ 0,0 1,67 @@
+[gd_scene load_steps=8 format=2]
+
+[ext_resource path="res://scenes/Game_Manager.gd" type="Script" id=1]
+[ext_resource path="res://prefabs/player_demo/Player.tscn" type="PackedScene" id=2]
+[ext_resource path="res://sprites/crosshair.png" type="Texture" id=3]
+[ext_resource path="res://prefabs/environment/Environment.tscn" type="PackedScene" id=4]
+[ext_resource path="res://prefabs/player_demo/bullet_mat.tres" type="Material" id=5]
+
+[sub_resource type="BoxShape" id=1]
+extents = Vector3( 300, 1, 300 )
+
+[sub_resource type="CubeMesh" id=2]
+
+[node name="Game_Manager" type="Node"]
+script = ExtResource( 1 )
+
+[node name="Environment" parent="." instance=ExtResource( 4 )]
+
+[node name="Dead_Zone" type="Area" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -30, 0 )
+
+[node name="CollisionShape" type="CollisionShape" parent="Dead_Zone"]
+shape = SubResource( 1 )
+
+[node name="Spawn_Point" type="Position3D" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 35, 0 )
+
+[node name="CrossHair" type="Control" parent="."]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Sprite" type="Sprite" parent="CrossHair"]
+scale = Vector2( 0.15, 0.15 )
+texture = ExtResource( 3 )
+
+[node name="Player" parent="." instance=ExtResource( 2 )]
+
+[node name="MeshInstance" type="MeshInstance" parent="."]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -5.88192, 1, -16.4228 )
+visible = false
+mesh = SubResource( 2 )
+material/0 = ExtResource( 5 )
+
+[node name="WaylandDisplay" type="WaylandDisplay" parent="."]
+
+[node name="WlrBackend" type="WlrBackend" parent="WaylandDisplay"]
+
+[node name="WlrCompositor" type="WlrCompositor" parent="WaylandDisplay/WlrBackend"]
+
+[node name="WlrOutput" type="WlrOutput" parent="WaylandDisplay/WlrBackend"]
+
+[node name="WlrDataDeviceManager" type="WlrDataDeviceManager" parent="WaylandDisplay"]
+
+[node name="WlrSeat" type="WlrSeat" parent="WaylandDisplay"]
+
+[node name="WlrXdgShell" type="WlrXdgShell" parent="WaylandDisplay"]
+[connection signal="body_entered" from="Dead_Zone" to="." method="_on_Dead_Zone_body_entered"]
+[connection signal="new_surface" from="WaylandDisplay/WlrXdgShell" to="." method="_on_WlrXdgShell_new_surface"]
+
+[editable path="Environment"]
+
+[editable path="Player"]

A threeston/sprites/crosshair.png => threeston/sprites/crosshair.png +0 -0

A threeston/sprites/crosshair.png.import => threeston/sprites/crosshair.png.import +36 -0
@@ 0,0 1,36 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path.s3tc="res://.import/crosshair.png-1281ee32d6777347e0f43a202c603c1b.s3tc.stex"
+path.etc2="res://.import/crosshair.png-1281ee32d6777347e0f43a202c603c1b.etc2.stex"
+metadata={
+"imported_formats": [ "s3tc", "etc2" ],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://sprites/crosshair.png"
+dest_files=[ "res://.import/crosshair.png-1281ee32d6777347e0f43a202c603c1b.s3tc.stex", "res://.import/crosshair.png-1281ee32d6777347e0f43a202c603c1b.etc2.stex" ]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=true
+flags/filter=true
+flags/mipmaps=true
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0