main 51b268bd45d2 cached
17 files
15.7 MB
9.2k tokens
1 requests
Download .txt
Repository: StayAtHomeDev-Git/FPS-Godot-Basic-Setup
Branch: main
Commit: 51b268bd45d2
Files: 17
Total size: 15.7 MB

Directory structure:
gitextract_erq62iwz/

├── .gitattributes
├── .gitignore
├── README.md
├── controllers/
│   ├── fps_controller.tscn
│   └── scripts/
│       └── fps_controller.gd
├── environment/
│   └── WE_test.tres
├── icon.svg.import
├── levels/
│   ├── WE_test.tscn
│   └── level_001.tscn
├── materials/
│   ├── grid.tres
│   └── player.tres
├── project.godot
├── readme_img.png.import
├── shaders/
│   └── grid.gdshader
└── textures/
    ├── grid.jpg.import
    ├── industrial_sunset_puresky_4k.hdr
    └── industrial_sunset_puresky_4k.hdr.import

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto


================================================
FILE: .gitignore
================================================
.godot/


================================================
FILE: README.md
================================================
# FPS Godot Basic Setup

![alt text](https://github.com/StayAtHomeDev-Git/FPS-Godot-Basic-Setup/blob/main/readme_img.png)

These are the project files for the first episode of my "FPS Godot Engine Project" video tutorial series.

That video series can be found here:

# Installation

Version: Godot Engine 4.1

- Git or Download the Zip
- Place project files into a project folder
- Import project into the Godot Engine

The project comes with all the source code from the tutorial video and any test levels or resources (materials, nodes, etc).

# License Agreement

Copyright (c) 2023 StayAtHomeDev, LLC

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.

# Sponsors

Thanks to all the sponsors of this project!

Geekeh


================================================
FILE: controllers/fps_controller.tscn
================================================
[gd_scene load_steps=5 format=3 uid="uid://c3ffql15mo0aj"]

[ext_resource type="Script" path="res://controllers/scripts/fps_controller.gd" id="1_pgc1p"]
[ext_resource type="Material" uid="uid://b4gwd5h7ixvct" path="res://materials/player.tres" id="2_gldw4"]

[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_u6tj1"]

[sub_resource type="CapsuleMesh" id="CapsuleMesh_6tv51"]
material = ExtResource("2_gldw4")

[node name="CharacterBody3D" type="CharacterBody3D" node_paths=PackedStringArray("CAMERA_CONTROLLER")]
script = ExtResource("1_pgc1p")
MOUSE_SENSITIVITY = 0.25
CAMERA_CONTROLLER = NodePath("CameraController/Camera3D")

[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
shape = SubResource("CapsuleShape3D_u6tj1")

[node name="PlaceholderMesh" type="MeshInstance3D" parent="CollisionShape3D"]
mesh = SubResource("CapsuleMesh_6tv51")

[node name="CameraController" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0)

[node name="Camera3D" type="Camera3D" parent="CameraController"]

[node name="ReflectionProbe" type="ReflectionProbe" parent="CameraController/Camera3D"]
update_mode = 1
enable_shadows = true


================================================
FILE: controllers/scripts/fps_controller.gd
================================================
extends CharacterBody3D

@export var SPEED : float = 5.0
@export var JUMP_VELOCITY : float = 4.5
@export var MOUSE_SENSITIVITY : float = 0.5
@export var TILT_LOWER_LIMIT := deg_to_rad(-90.0)
@export var TILT_UPPER_LIMIT := deg_to_rad(90.0)
@export var CAMERA_CONTROLLER : Camera3D

var _mouse_input : bool = false
var _rotation_input : float
var _tilt_input : float
var _mouse_rotation : Vector3
var _player_rotation : Vector3
var _camera_rotation : Vector3

# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")

func _unhandled_input(event: InputEvent) -> void:
	
	_mouse_input = event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED
	if _mouse_input:
		_rotation_input = -event.relative.x * MOUSE_SENSITIVITY
		_tilt_input = -event.relative.y * MOUSE_SENSITIVITY
		
func _input(event):
	
	if event.is_action_pressed("exit"):
		get_tree().quit()
		
func _update_camera(delta):
	
	# Rotates camera using euler rotation
	_mouse_rotation.x += _tilt_input * delta
	_mouse_rotation.x = clamp(_mouse_rotation.x, TILT_LOWER_LIMIT, TILT_UPPER_LIMIT)
	_mouse_rotation.y += _rotation_input * delta
	
	_player_rotation = Vector3(0.0,_mouse_rotation.y,0.0)
	_camera_rotation = Vector3(_mouse_rotation.x,0.0,0.0)

	CAMERA_CONTROLLER.transform.basis = Basis.from_euler(_camera_rotation)
	global_transform.basis = Basis.from_euler(_player_rotation)
	
	CAMERA_CONTROLLER.rotation.z = 0.0

	_rotation_input = 0.0
	_tilt_input = 0.0
	
func _ready():

	# Get mouse input
	Input.mouse_mode = Input.MOUSE_MODE_CAPTURED

func _physics_process(delta):
	
	# Update camera movement based on mouse movement
	_update_camera(delta)
	
	# Add the gravity.
	if not is_on_floor():
		velocity.y -= gravity * delta

	# Handle Jump.
	if Input.is_action_just_pressed("jump") and is_on_floor():
		velocity.y = JUMP_VELOCITY

	# Get the input direction and handle the movement/deceleration.
	# As good practice, you should replace UI actions with custom gameplay actions.
	var input_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_backward")
	
	var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
	
	if direction:
		velocity.x = direction.x * SPEED
		velocity.z = direction.z * SPEED
	else:
		velocity.x = move_toward(velocity.x, 0, SPEED)
		velocity.z = move_toward(velocity.z, 0, SPEED)

	move_and_slide()


================================================
FILE: environment/WE_test.tres
================================================
[gd_resource type="Environment" load_steps=4 format=3 uid="uid://dsay4gdr8k6ur"]

[ext_resource type="Texture2D" uid="uid://b1jvh1ehiaebt" path="res://textures/industrial_sunset_puresky_4k.hdr" id="1_iwpli"]

[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_cmrwf"]
panorama = ExtResource("1_iwpli")

[sub_resource type="Sky" id="Sky_0poj2"]
sky_material = SubResource("PanoramaSkyMaterial_cmrwf")

[resource]
background_mode = 2
sky = SubResource("Sky_0poj2")
ambient_light_source = 3
reflected_light_source = 2
volumetric_fog_density = 0.017


================================================
FILE: icon.svg.import
================================================
[remap]

importer="texture"
type="CompressedTexture2D"
uid="uid://dskt1ln2x8owi"
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://icon.svg"
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]

[params]

compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
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=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false


================================================
FILE: levels/WE_test.tscn
================================================
[gd_scene load_steps=2 format=3 uid="uid://btv0a42cgxt8g"]

[ext_resource type="Environment" uid="uid://dsay4gdr8k6ur" path="res://environment/WE_test.tres" id="1_cvy6j"]

[node name="WorldEnvironment" type="WorldEnvironment"]
environment = ExtResource("1_cvy6j")

[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.905183, -0.346446, -0.246207, 0, -0.579281, 0.815128, -0.425021, -0.73784, -0.524356, 0, 0, 0)
shadow_enabled = true


================================================
FILE: levels/level_001.tscn
================================================
[gd_scene load_steps=14 format=3 uid="uid://b1yleqbb8tc7x"]

[ext_resource type="PackedScene" uid="uid://btv0a42cgxt8g" path="res://levels/WE_test.tscn" id="1_db21n"]
[ext_resource type="Material" uid="uid://cn1gsy15bkaff" path="res://materials/grid.tres" id="2_x5xie"]
[ext_resource type="Texture2D" uid="uid://ivvpsi314b34" path="res://textures/grid.jpg" id="3_yfwkt"]
[ext_resource type="PackedScene" uid="uid://c3ffql15mo0aj" path="res://controllers/fps_controller.tscn" id="4_liofc"]

[sub_resource type="BoxMesh" id="BoxMesh_gd0ev"]
material = ExtResource("2_x5xie")
size = Vector3(20, 0.5, 20)

[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_oahyi"]
data = PackedVector3Array(-10, 0.25, 10, 10, 0.25, 10, -10, -0.25, 10, 10, 0.25, 10, 10, -0.25, 10, -10, -0.25, 10, 10, 0.25, -10, -10, 0.25, -10, 10, -0.25, -10, -10, 0.25, -10, -10, -0.25, -10, 10, -0.25, -10, 10, 0.25, 10, 10, 0.25, -10, 10, -0.25, 10, 10, 0.25, -10, 10, -0.25, -10, 10, -0.25, 10, -10, 0.25, -10, -10, 0.25, 10, -10, -0.25, -10, -10, 0.25, 10, -10, -0.25, 10, -10, -0.25, -10, 10, 0.25, 10, -10, 0.25, 10, 10, 0.25, -10, -10, 0.25, 10, -10, 0.25, -10, 10, 0.25, -10, -10, -0.25, 10, 10, -0.25, 10, -10, -0.25, -10, 10, -0.25, 10, 10, -0.25, -10, -10, -0.25, -10)

[sub_resource type="Shader" id="Shader_cwof1"]
code = "// NOTE: Shader automatically converted from Godot Engine 4.1.dev4's StandardMaterial3D.

shader_type spatial;
render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_schlick_ggx;
uniform vec4 albedo : source_color;
uniform sampler2D texture_albedo : source_color,filter_linear_mipmap,repeat_enable;
uniform float point_size : hint_range(0,128);
uniform float roughness : hint_range(0,1);
uniform sampler2D texture_metallic : hint_default_white,filter_linear_mipmap,repeat_enable;
uniform vec4 metallic_texture_channel;
uniform sampler2D texture_roughness : hint_roughness_r,filter_linear_mipmap,repeat_enable;
uniform float specular;
uniform float metallic;
varying vec3 uv1_triplanar_pos;
uniform float uv1_blend_sharpness;
varying vec3 uv1_power_normal;
uniform vec3 uv1_scale;
uniform vec3 uv1_offset;
uniform vec3 uv2_scale;
uniform vec3 uv2_offset;


void vertex() {
	TANGENT = vec3(0.0,0.0,-1.0) * abs(NORMAL.x);
	TANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.y);
	TANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.z);
	TANGENT = normalize(TANGENT);
	BINORMAL = vec3(0.0,1.0,0.0) * abs(NORMAL.x);
	BINORMAL+= vec3(0.0,0.0,-1.0) * abs(NORMAL.y);
	BINORMAL+= vec3(0.0,1.0,0.0) * abs(NORMAL.z);
	BINORMAL = normalize(BINORMAL);
	uv1_power_normal=pow(abs(NORMAL),vec3(uv1_blend_sharpness));
	uv1_triplanar_pos = VERTEX * uv1_scale + uv1_offset;
	uv1_power_normal/=dot(uv1_power_normal,vec3(1.0));
	uv1_triplanar_pos *= vec3(1.0,-1.0, 1.0);
}

vec4 triplanar_texture(sampler2D p_sampler,vec3 p_weights,vec3 p_triplanar_pos) {
	vec4 samp=vec4(0.0);
	samp+= texture(p_sampler,p_triplanar_pos.xy) * p_weights.z;
	samp+= texture(p_sampler,p_triplanar_pos.xz) * p_weights.y;
	samp+= texture(p_sampler,p_triplanar_pos.zy * vec2(-1.0,1.0)) * p_weights.x;
	return samp;
}

void fragment() {
	vec4 albedo_tex = triplanar_texture(texture_albedo,uv1_power_normal,uv1_triplanar_pos);
	ALBEDO = (albedo.rgb * albedo_tex.r) + albedo_tex.g + albedo_tex.b;
	float metallic_tex = dot(triplanar_texture(texture_metallic,uv1_power_normal,uv1_triplanar_pos),metallic_texture_channel);
	METALLIC = metallic_tex * metallic;
	vec4 roughness_texture_channel = vec4(1.0,0.0,0.0,0.0);
	float roughness_tex = dot(triplanar_texture(texture_roughness,uv1_power_normal,uv1_triplanar_pos),roughness_texture_channel);
	ROUGHNESS = (1.0 - albedo_tex.g) * roughness;
	SPECULAR = specular;
}
"

[sub_resource type="ShaderMaterial" id="ShaderMaterial_0racc"]
render_priority = 0
shader = SubResource("Shader_cwof1")
shader_parameter/albedo = Color(0.937255, 1, 0, 1)
shader_parameter/point_size = 1.0
shader_parameter/roughness = 0.5
shader_parameter/metallic_texture_channel = Plane(1, 0, 0, 0)
shader_parameter/specular = 0.5
shader_parameter/metallic = 0.0
shader_parameter/uv1_blend_sharpness = 1.0
shader_parameter/uv1_scale = Vector3(0.5, 0.5, 0.5)
shader_parameter/uv1_offset = Vector3(0.5, 0.5, 0.5)
shader_parameter/uv2_scale = Vector3(1, 1, 1)
shader_parameter/uv2_offset = Vector3(0, 0, 0)
shader_parameter/texture_albedo = ExtResource("3_yfwkt")
shader_parameter/texture_roughness = ExtResource("3_yfwkt")

[sub_resource type="BoxMesh" id="BoxMesh_xc4gq"]
material = SubResource("ShaderMaterial_0racc")
size = Vector3(2, 2, 2)

[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_vp4dy"]
data = PackedVector3Array(-1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1, 1, -1, 1, 1, -1, -1, -1, -1, -1)

[sub_resource type="ShaderMaterial" id="ShaderMaterial_62u37"]
render_priority = 0
shader = SubResource("Shader_cwof1")
shader_parameter/albedo = Color(0, 0.67451, 0, 1)
shader_parameter/point_size = 1.0
shader_parameter/roughness = 0.5
shader_parameter/metallic_texture_channel = Plane(1, 0, 0, 0)
shader_parameter/specular = 0.5
shader_parameter/metallic = 0.0
shader_parameter/uv1_blend_sharpness = 1.0
shader_parameter/uv1_scale = Vector3(0.5, 0.5, 0.5)
shader_parameter/uv1_offset = Vector3(1, 0.5, 0.5)
shader_parameter/uv2_scale = Vector3(1, 1, 1)
shader_parameter/uv2_offset = Vector3(0, 0, 0)
shader_parameter/texture_albedo = ExtResource("3_yfwkt")
shader_parameter/texture_roughness = ExtResource("3_yfwkt")

[sub_resource type="PrismMesh" id="PrismMesh_rutao"]
material = SubResource("ShaderMaterial_62u37")
left_to_right = 0.0
size = Vector3(8, 2, 2)

[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_j6kcl"]
data = PackedVector3Array(-4, 1, 1, 4, -1, 1, -4, -1, 1, -4, 1, -1, -4, -1, -1, 4, -1, -1, -4, 1, 1, -4, 1, -1, 4, -1, 1, -4, 1, -1, 4, -1, -1, 4, -1, 1, -4, 1, -1, -4, 1, 1, -4, -1, -1, -4, 1, 1, -4, -1, 1, -4, -1, -1, -4, -1, 1, 4, -1, 1, -4, -1, -1, 4, -1, 1, 4, -1, -1, -4, -1, -1)

[node name="Node3D" type="Node3D"]

[node name="WorldEnvironment" parent="." instance=ExtResource("1_db21n")]

[node name="Floor" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.25, 0)
mesh = SubResource("BoxMesh_gd0ev")

[node name="StaticBody3D" type="StaticBody3D" parent="Floor"]

[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor/StaticBody3D"]
shape = SubResource("ConcavePolygonShape3D_oahyi")

[node name="Box" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 1, -5)
mesh = SubResource("BoxMesh_xc4gq")

[node name="StaticBody3D" type="StaticBody3D" parent="Box"]

[node name="CollisionShape3D" type="CollisionShape3D" parent="Box/StaticBody3D"]
shape = SubResource("ConcavePolygonShape3D_vp4dy")

[node name="Ramp" type="MeshInstance3D" parent="."]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 5, 0, 0)
mesh = SubResource("PrismMesh_rutao")
skeleton = NodePath("../Box")

[node name="StaticBody3D" type="StaticBody3D" parent="Ramp"]

[node name="CollisionShape3D" type="CollisionShape3D" parent="Ramp/StaticBody3D"]
shape = SubResource("ConcavePolygonShape3D_j6kcl")

[node name="CharacterBody3D" parent="." instance=ExtResource("4_liofc")]


================================================
FILE: materials/grid.tres
================================================
[gd_resource type="ShaderMaterial" load_steps=3 format=3 uid="uid://cn1gsy15bkaff"]

[ext_resource type="Texture2D" uid="uid://ivvpsi314b34" path="res://textures/grid.jpg" id="1_57ppx"]

[sub_resource type="Shader" id="Shader_cwof1"]
code = "// NOTE: Shader automatically converted from Godot Engine 4.1.dev4's StandardMaterial3D.

shader_type spatial;
render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_schlick_ggx;
uniform vec4 albedo : source_color;
uniform sampler2D texture_albedo : source_color,filter_linear_mipmap,repeat_enable;
uniform float point_size : hint_range(0,128);
uniform float roughness : hint_range(0,1);
uniform sampler2D texture_metallic : hint_default_white,filter_linear_mipmap,repeat_enable;
uniform vec4 metallic_texture_channel;
uniform sampler2D texture_roughness : hint_roughness_r,filter_linear_mipmap,repeat_enable;
uniform float specular;
uniform float metallic;
varying vec3 uv1_triplanar_pos;
uniform float uv1_blend_sharpness;
varying vec3 uv1_power_normal;
uniform vec3 uv1_scale;
uniform vec3 uv1_offset;
uniform vec3 uv2_scale;
uniform vec3 uv2_offset;


void vertex() {
	TANGENT = vec3(0.0,0.0,-1.0) * abs(NORMAL.x);
	TANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.y);
	TANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.z);
	TANGENT = normalize(TANGENT);
	BINORMAL = vec3(0.0,1.0,0.0) * abs(NORMAL.x);
	BINORMAL+= vec3(0.0,0.0,-1.0) * abs(NORMAL.y);
	BINORMAL+= vec3(0.0,1.0,0.0) * abs(NORMAL.z);
	BINORMAL = normalize(BINORMAL);
	uv1_power_normal=pow(abs(NORMAL),vec3(uv1_blend_sharpness));
	uv1_triplanar_pos = VERTEX * uv1_scale + uv1_offset;
	uv1_power_normal/=dot(uv1_power_normal,vec3(1.0));
	uv1_triplanar_pos *= vec3(1.0,-1.0, 1.0);
}

vec4 triplanar_texture(sampler2D p_sampler,vec3 p_weights,vec3 p_triplanar_pos) {
	vec4 samp=vec4(0.0);
	samp+= texture(p_sampler,p_triplanar_pos.xy) * p_weights.z;
	samp+= texture(p_sampler,p_triplanar_pos.xz) * p_weights.y;
	samp+= texture(p_sampler,p_triplanar_pos.zy * vec2(-1.0,1.0)) * p_weights.x;
	return samp;
}

void fragment() {
	vec4 albedo_tex = triplanar_texture(texture_albedo,uv1_power_normal,uv1_triplanar_pos);
	ALBEDO = (albedo.rgb * albedo_tex.r) + albedo_tex.g + albedo_tex.b;
	float metallic_tex = dot(triplanar_texture(texture_metallic,uv1_power_normal,uv1_triplanar_pos),metallic_texture_channel);
	METALLIC = metallic_tex * metallic;
	vec4 roughness_texture_channel = vec4(1.0,0.0,0.0,0.0);
	float roughness_tex = dot(triplanar_texture(texture_roughness,uv1_power_normal,uv1_triplanar_pos),roughness_texture_channel);
	ROUGHNESS = (1.0 - albedo_tex.g) * roughness;
	SPECULAR = specular;
}
"

[resource]
render_priority = 0
shader = SubResource("Shader_cwof1")
shader_parameter/albedo = Color(0, 0, 0, 1)
shader_parameter/point_size = 1.0
shader_parameter/roughness = 0.5
shader_parameter/metallic_texture_channel = Plane(1, 0, 0, 0)
shader_parameter/specular = 0.5
shader_parameter/metallic = 0.0
shader_parameter/uv1_blend_sharpness = 1.0
shader_parameter/uv1_scale = Vector3(0.5, 0.5, 0.5)
shader_parameter/uv1_offset = Vector3(0, 0, 0)
shader_parameter/uv2_scale = Vector3(1, 1, 1)
shader_parameter/uv2_offset = Vector3(0, 0, 0)
shader_parameter/texture_albedo = ExtResource("1_57ppx")
shader_parameter/texture_roughness = ExtResource("1_57ppx")


================================================
FILE: materials/player.tres
================================================
[gd_resource type="StandardMaterial3D" format=3 uid="uid://b4gwd5h7ixvct"]

[resource]
albedo_color = Color(0.847059, 0.0862745, 0, 1)
roughness = 0.32
emission = Color(0.188235, 0.254902, 1, 1)
emission_energy_multiplier = 0.0


================================================
FILE: project.godot
================================================
; 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=5

[application]

config/name="001 - Basic Setup"
run/main_scene="res://levels/level_001.tscn"
config/features=PackedStringArray("4.1", "Forward Plus")
config/icon="res://icon.svg"

[display]

window/size/always_on_top=true

[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,"echo":false,"script":null)
]
}
move_backward={
"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,"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,"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,"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,"echo":false,"script":null)
]
}
exit={
"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,"echo":false,"script":null)
]
}

[rendering]

textures/default_filters/anisotropic_filtering_level=4
textures/default_filters/texture_mipmap_bias=-1.0
anti_aliasing/quality/msaa_3d=3
anti_aliasing/quality/screen_space_aa=1


================================================
FILE: readme_img.png.import
================================================
[remap]

importer="texture"
type="CompressedTexture2D"
uid="uid://s6s85xa1lxce"
path="res://.godot/imported/readme_img.png-c87ac3de286d8379757c000042cce94f.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://readme_img.png"
dest_files=["res://.godot/imported/readme_img.png-c87ac3de286d8379757c000042cce94f.ctex"]

[params]

compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
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=1


================================================
FILE: shaders/grid.gdshader
================================================
// NOTE: Shader automatically converted from Godot Engine 4.1.dev4's StandardMaterial3D.

shader_type spatial;
render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_schlick_ggx;
uniform vec4 albedo : source_color;
uniform sampler2D texture_albedo : source_color,filter_linear_mipmap,repeat_enable;
uniform float point_size : hint_range(0,128);
uniform float roughness : hint_range(0,1);
uniform sampler2D texture_metallic : hint_default_white,filter_linear_mipmap,repeat_enable;
uniform vec4 metallic_texture_channel;
uniform sampler2D texture_roughness : hint_roughness_r,filter_linear_mipmap,repeat_enable;
uniform float specular;
uniform float metallic;
varying vec3 uv1_triplanar_pos;
uniform float uv1_blend_sharpness;
varying vec3 uv1_power_normal;
uniform vec3 uv1_scale;
uniform vec3 uv1_offset;
uniform vec3 uv2_scale;
uniform vec3 uv2_offset;


void vertex() {
	TANGENT = vec3(0.0,0.0,-1.0) * abs(NORMAL.x);
	TANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.y);
	TANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.z);
	TANGENT = normalize(TANGENT);
	BINORMAL = vec3(0.0,1.0,0.0) * abs(NORMAL.x);
	BINORMAL+= vec3(0.0,0.0,-1.0) * abs(NORMAL.y);
	BINORMAL+= vec3(0.0,1.0,0.0) * abs(NORMAL.z);
	BINORMAL = normalize(BINORMAL);
	uv1_power_normal=pow(abs(NORMAL),vec3(uv1_blend_sharpness));
	uv1_triplanar_pos = VERTEX * uv1_scale + uv1_offset;
	uv1_power_normal/=dot(uv1_power_normal,vec3(1.0));
	uv1_triplanar_pos *= vec3(1.0,-1.0, 1.0);
}

vec4 triplanar_texture(sampler2D p_sampler,vec3 p_weights,vec3 p_triplanar_pos) {
	vec4 samp=vec4(0.0);
	samp+= texture(p_sampler,p_triplanar_pos.xy) * p_weights.z;
	samp+= texture(p_sampler,p_triplanar_pos.xz) * p_weights.y;
	samp+= texture(p_sampler,p_triplanar_pos.zy * vec2(-1.0,1.0)) * p_weights.x;
	return samp;
}

void fragment() {
	vec4 albedo_tex = triplanar_texture(texture_albedo,uv1_power_normal,uv1_triplanar_pos);
	ALBEDO = (albedo.rgb * albedo_tex.r) + albedo_tex.g + albedo_tex.b;
	float metallic_tex = dot(triplanar_texture(texture_metallic,uv1_power_normal,uv1_triplanar_pos),metallic_texture_channel);
	METALLIC = metallic_tex * metallic;
	vec4 roughness_texture_channel = vec4(1.0,0.0,0.0,0.0);
	float roughness_tex = dot(triplanar_texture(texture_roughness,uv1_power_normal,uv1_triplanar_pos),roughness_texture_channel);
	ROUGHNESS = (1.0 - albedo_tex.g) * roughness;
	SPECULAR = specular;
}


================================================
FILE: textures/grid.jpg.import
================================================
[remap]

importer="texture"
type="CompressedTexture2D"
uid="uid://ivvpsi314b34"
path.bptc="res://.godot/imported/grid.jpg-98e91c7ac35e7c2efc8df0a4f602d545.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}

[deps]

source_file="res://textures/grid.jpg"
dest_files=["res://.godot/imported/grid.jpg-98e91c7ac35e7c2efc8df0a4f602d545.bptc.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


================================================
FILE: textures/industrial_sunset_puresky_4k.hdr
================================================
[File too large to display: 15.6 MB]

================================================
FILE: textures/industrial_sunset_puresky_4k.hdr.import
================================================
[remap]

importer="texture"
type="CompressedTexture2D"
uid="uid://b1jvh1ehiaebt"
path.bptc="res://.godot/imported/industrial_sunset_puresky_4k.hdr-f720137328f9b57effb6dcc1298b5e3b.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}

[deps]

source_file="res://textures/industrial_sunset_puresky_4k.hdr"
dest_files=["res://.godot/imported/industrial_sunset_puresky_4k.hdr-f720137328f9b57effb6dcc1298b5e3b.bptc.ctex"]

[params]

compress/mode=2
compress/high_quality=false
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
Download .txt
gitextract_erq62iwz/

├── .gitattributes
├── .gitignore
├── README.md
├── controllers/
│   ├── fps_controller.tscn
│   └── scripts/
│       └── fps_controller.gd
├── environment/
│   └── WE_test.tres
├── icon.svg.import
├── levels/
│   ├── WE_test.tscn
│   └── level_001.tscn
├── materials/
│   ├── grid.tres
│   └── player.tres
├── project.godot
├── readme_img.png.import
├── shaders/
│   └── grid.gdshader
└── textures/
    ├── grid.jpg.import
    ├── industrial_sunset_puresky_4k.hdr
    └── industrial_sunset_puresky_4k.hdr.import
Condensed preview — 17 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (28K chars).
[
  {
    "path": ".gitattributes",
    "chars": 66,
    "preview": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": ".gitignore",
    "chars": 8,
    "preview": ".godot/\n"
  },
  {
    "path": "README.md",
    "chars": 1695,
    "preview": "# FPS Godot Basic Setup\n\n![alt text](https://github.com/StayAtHomeDev-Git/FPS-Godot-Basic-Setup/blob/main/readme_img.png"
  },
  {
    "path": "controllers/fps_controller.tscn",
    "chars": 1235,
    "preview": "[gd_scene load_steps=5 format=3 uid=\"uid://c3ffql15mo0aj\"]\n\n[ext_resource type=\"Script\" path=\"res://controllers/scripts/"
  },
  {
    "path": "controllers/scripts/fps_controller.gd",
    "chars": 2460,
    "preview": "extends CharacterBody3D\n\n@export var SPEED : float = 5.0\n@export var JUMP_VELOCITY : float = 4.5\n@export var MOUSE_SENSI"
  },
  {
    "path": "environment/WE_test.tres",
    "chars": 560,
    "preview": "[gd_resource type=\"Environment\" load_steps=4 format=3 uid=\"uid://dsay4gdr8k6ur\"]\n\n[ext_resource type=\"Texture2D\" uid=\"ui"
  },
  {
    "path": "icon.svg.import",
    "chars": 843,
    "preview": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://dskt1ln2x8owi\"\npath=\"res://.godot/imported/icon.svg-21"
  },
  {
    "path": "levels/WE_test.tscn",
    "chars": 478,
    "preview": "[gd_scene load_steps=2 format=3 uid=\"uid://btv0a42cgxt8g\"]\n\n[ext_resource type=\"Environment\" uid=\"uid://dsay4gdr8k6ur\" p"
  },
  {
    "path": "levels/level_001.tscn",
    "chars": 7520,
    "preview": "[gd_scene load_steps=14 format=3 uid=\"uid://b1yleqbb8tc7x\"]\n\n[ext_resource type=\"PackedScene\" uid=\"uid://btv0a42cgxt8g\" "
  },
  {
    "path": "materials/grid.tres",
    "chars": 3265,
    "preview": "[gd_resource type=\"ShaderMaterial\" load_steps=3 format=3 uid=\"uid://cn1gsy15bkaff\"]\n\n[ext_resource type=\"Texture2D\" uid="
  },
  {
    "path": "materials/player.tres",
    "chars": 228,
    "preview": "[gd_resource type=\"StandardMaterial3D\" format=3 uid=\"uid://b4gwd5h7ixvct\"]\n\n[resource]\nalbedo_color = Color(0.847059, 0."
  },
  {
    "path": "project.godot",
    "chars": 2673,
    "preview": "; Engine configuration file.\n; It's best edited using the editor UI and not directly,\n; since the parameters that go her"
  },
  {
    "path": "readme_img.png.import",
    "chars": 763,
    "preview": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://s6s85xa1lxce\"\npath=\"res://.godot/imported/readme_img.p"
  },
  {
    "path": "shaders/grid.gdshader",
    "chars": 2363,
    "preview": "// NOTE: Shader automatically converted from Godot Engine 4.1.dev4's StandardMaterial3D.\n\nshader_type spatial;\nrender_mo"
  },
  {
    "path": "textures/grid.jpg.import",
    "chars": 801,
    "preview": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://ivvpsi314b34\"\npath.bptc=\"res://.godot/imported/grid.jp"
  },
  {
    "path": "textures/industrial_sunset_puresky_4k.hdr.import",
    "chars": 875,
    "preview": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://b1jvh1ehiaebt\"\npath.bptc=\"res://.godot/imported/indust"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the StayAtHomeDev-Git/FPS-Godot-Basic-Setup GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 17 files (15.7 MB), approximately 9.2k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!