diff --git a/assets/textures/test.png b/assets/textures/test.png new file mode 100644 index 0000000..64d0c49 --- /dev/null +++ b/assets/textures/test.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9cb74472077cb28409596547accca99f7392cdf3e3464a09307ec1fe4a3148dc +size 147 diff --git a/assets/textures/test.png.import b/assets/textures/test.png.import new file mode 100644 index 0000000..ee46248 --- /dev/null +++ b/assets/textures/test.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bkum6o07bt8j6" +path.bptc="res://.godot/imported/test.png-b04f023894a45ea434621806389fec71.bptc.ctex" +path.astc="res://.godot/imported/test.png-b04f023894a45ea434621806389fec71.astc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/textures/test.png" +dest_files=["res://.godot/imported/test.png-b04f023894a45ea434621806389fec71.bptc.ctex", "res://.godot/imported/test.png-b04f023894a45ea434621806389fec71.astc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=true +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/project.godot b/project.godot index 9771255..6138aa2 100644 --- a/project.godot +++ b/project.godot @@ -52,6 +52,45 @@ movie_writer/fps=120 import/fbx2gltf/enabled=false import/blender/enabled=false +[input] + +move_forward={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +] +} +move_back={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +] +} +move_left={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) +] +} +move_right={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +] +} +jump={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +] +} +menu={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +toggle_fullscreen={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194309,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194342,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} + [physics] common/physics_jitter_fix=0.0 diff --git a/resources/materials/test_triplanar.tres b/resources/materials/test_triplanar.tres new file mode 100644 index 0000000..d3b557f --- /dev/null +++ b/resources/materials/test_triplanar.tres @@ -0,0 +1,8 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://00ldcihmubqo"] + +[ext_resource type="Texture2D" uid="uid://bkum6o07bt8j6" path="res://assets/textures/test.png" id="1_f5hmr"] + +[resource] +albedo_texture = ExtResource("1_f5hmr") +uv1_triplanar = true +texture_filter = 0 diff --git a/scenes/main.tscn b/scenes/main.tscn index 3ac69af..57f724d 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -1,3 +1,32 @@ -[gd_scene format=3 uid="uid://b7fc42grqckl0"] +[gd_scene load_steps=5 format=3 uid="uid://b7fc42grqckl0"] -[node name="Main" type="Node3D"] +[ext_resource type="Script" path="res://scripts/main.gd" id="1_80y7k"] +[ext_resource type="PackedScene" uid="uid://bvleufyobery5" path="res://scenes/player.tscn" id="1_lntus"] +[ext_resource type="Material" uid="uid://00ldcihmubqo" path="res://resources/materials/test_triplanar.tres" id="3_vk6ds"] + +[sub_resource type="Environment" id="Environment_wyusq"] + +[node name="Main" type="Node"] +script = ExtResource("1_80y7k") + +[node name="Players" type="Node" parent="."] + +[node name="Player" parent="Players" instance=ExtResource("1_lntus")] + +[node name="Geometry" type="Node" parent="."] + +[node name="CSGCombiner3D" type="CSGCombiner3D" parent="Geometry"] +material_override = ExtResource("3_vk6ds") +use_collision = true + +[node name="CSGBox3D" type="CSGBox3D" parent="Geometry/CSGCombiner3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -50, 0) +size = Vector3(10, 100, 10) + +[node name="Lights" type="Node" parent="."] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Lights"] +transform = Transform3D(0.866025, -0.433013, 0.25, 0, 0.5, 0.866025, -0.5, -0.75, 0.433013, 0, 0, 0) + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_wyusq") diff --git a/scenes/player.tscn b/scenes/player.tscn new file mode 100644 index 0000000..f25faf0 --- /dev/null +++ b/scenes/player.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://bvleufyobery5"] + +[ext_resource type="Script" path="res://scripts/player.gd" id="1_82m0t"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_wlolw"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_5kiq6"] + +[node name="Player" type="CharacterBody3D"] +script = ExtResource("1_82m0t") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CapsuleShape3D_wlolw") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("CapsuleMesh_5kiq6") + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0) +current = true diff --git a/scripts/main.gd b/scripts/main.gd new file mode 100644 index 0000000..7ae481b --- /dev/null +++ b/scripts/main.gd @@ -0,0 +1,10 @@ +extends Node + + +func _ready() -> void: + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + + +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_pressed("menu"): + get_tree().quit() diff --git a/scripts/player.gd b/scripts/player.gd new file mode 100644 index 0000000..6c0fe5b --- /dev/null +++ b/scripts/player.gd @@ -0,0 +1,98 @@ +class_name Player +extends CharacterBody3D + +const MOVE_SPEED: float = 5 +const MOVE_ACCELERATION: float = 25 +const MOVE_DECELERATION: float = 25 + +const JUMP_FORCE: float = 10 +const FALL_SPEED: float = 20 +const FALL_ACCELERATION: float = 25 + +@export var _respawn_height: float = -100 + +var _respawn_point: Vector3 + +@onready var _camera: Camera3D = $Camera3D + + +func _ready() -> void: + _respawn_point = global_position + + +func _process(_delta: float) -> void: + if global_position.y < _respawn_height: + global_position = _respawn_point + velocity = Vector3.ZERO + + +func _physics_process(delta: float) -> void: + _lateral_movement(delta) + _vertical_movement(delta) + + _jumping(delta) + + move_and_slide() + + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventMouseMotion: + var mouse_event := event as InputEventMouseMotion + rotate_y(-mouse_event.screen_relative.x * 0.005) + _camera.rotate_x(-mouse_event.screen_relative.y * 0.005) + _camera.rotation.x = clamp(_camera.rotation.x, -PI / 2, PI / 2) + + if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: + if event is InputEventMouseMotion: + var mouse_event := event as InputEventMouseMotion + var sensitivity := deg_to_rad(Settings.mouse_sensitivity) + + rotate_y( + ( + -mouse_event.screen_relative.x + * sensitivity + * (-1 if Settings.invert_mouse_horizontal else 1) + ) + ) + + _camera.rotate_x( + ( + -mouse_event.screen_relative.y + * sensitivity + * (-1 if Settings.invert_mouse_vertical else 1) + ) + ) + _camera.rotation.x = clamp(_camera.rotation.x, -PI / 2, PI / 2) + + +func _lateral_movement(delta: float) -> void: + var input_dir := Input.get_vector( + "move_left", "move_right", "move_forward", "move_back" + ) + var has_input := input_dir.length() > 0 + + if has_input: + var direction := ( + (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() + ) + var new_velocity := direction * MOVE_SPEED + new_velocity.y = velocity.y + velocity = velocity.move_toward(new_velocity, MOVE_ACCELERATION * delta) + else: + var new_velocity := Vector3.ZERO + new_velocity.y = velocity.y + velocity = velocity.move_toward(new_velocity, MOVE_DECELERATION * delta) + + +func _vertical_movement(delta: float) -> void: + if not is_on_floor(): + var new_velocity := velocity + new_velocity.y = -FALL_SPEED + velocity = velocity.move_toward(new_velocity, FALL_ACCELERATION * delta) + else: + velocity.y = 0 + + +func _jumping(_delta: float) -> void: + if Input.is_action_just_pressed("jump") and is_on_floor(): + velocity.y = JUMP_FORCE