This commit is contained in:
Crizomb 2025-08-02 23:51:48 +02:00
parent ad95711535
commit 2e310f4053
25 changed files with 852 additions and 74 deletions

View file

@ -0,0 +1,11 @@
extends Camera3D
@export var follow_point : Node3D
@export var follow_speed := 10.0
@export var rotation_speed := 8.0
func _physics_process(delta: float) -> void:
var target_basis = follow_point.global_transform.basis
var current_basis = global_transform.basis
global_transform.origin = global_transform.origin.lerp(follow_point.global_position, follow_speed * delta)
global_transform.basis = current_basis.slerp(target_basis, rotation_speed * delta)

View file

@ -0,0 +1 @@
uid://bdhupx1blbgwo

View file

@ -1,6 +1,8 @@
extends RigidBody3D
class_name Car
@export var road_path : RoadPath
@export var forward_force: float = 100.0
@export var backward_force: float = 50.0
@export var steer_speed: float = 2.0
@ -9,10 +11,10 @@ class_name Car
@export var lateral_velocity_start_drift_threshold: float = 10.0
@export var lateral_velocity_total_drift_threshold: float = 15.0
@onready var forward_left: RayCast3D = $Raycasts/ForwardLeft
@onready var forward_right: RayCast3D = $Raycasts/ForwardRight
@onready var backward_right: RayCast3D = $Raycasts/BackwardRight
@onready var backward_left: RayCast3D = $Raycasts/BackwardLeft
@onready var forward_left: RayCast3D = $ForwardLeft
@onready var forward_right: RayCast3D = $ForwardRight
@onready var backward_right: RayCast3D = $BackwardRight
@onready var backward_left: RayCast3D = $BackwardLeft
@onready var forward_left_respawn: RayCast3D = $RaycastsRespawn/ForwardLeftRespawn
@onready var forward_right_respawn: RayCast3D = $RaycastsRespawn/ForwardRightRespawn
@ -31,10 +33,13 @@ var respawn_pos : Vector3
var thread: Thread = Thread.new()
var steer_input = 0.0
var cheat := false
var air_time := 0.0
func custom_gravity() -> Vector3:
var attractor = road_path.to_global(road_path.curve.get_closest_point(road_path.to_local(position)))
return (attractor - position).normalized()
func return_to_road():
position = respawn_pos + 3*Vector3.UP
rotation.z = 0
@ -58,10 +63,13 @@ func _physics_process(delta: float) -> void:
var is_all_wheel_on_floor := backward_left_respawn.is_colliding() && backward_right_respawn.is_colliding() && forward_left_respawn.is_colliding() && forward_right_respawn.is_colliding()
var is_flat : bool = transform.basis.y.dot(Vector3.UP) > 0.9
# Doing custom gravity like a chad
PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY_VECTOR, custom_gravity())
if is_all_wheel_on_floor && is_flat:
respawn_pos = position
if !is_on_floor && !cheat:
if !is_on_floor:
#$DriftParticles.emitting = false
#$DriftParticles2.emitting = false
#AudioServer.set_bus_volume_db(5, -80)
@ -70,10 +78,6 @@ func _physics_process(delta: float) -> void:
return_to_road()
return
air_time = 0.0
if cheat && Input.is_key_pressed(KEY_SPACE):
linear_velocity.y += 20*delta
if cheat:
forward_force = 500
# Movement
if move_input > 0.0:
@ -117,5 +121,3 @@ func _physics_process(delta: float) -> void:
apply_central_force(lateral_friction_force)

View file

@ -1,38 +1,48 @@
[gd_scene load_steps=4 format=3 uid="uid://dgs0fqojgcmu3"]
[gd_scene load_steps=6 format=3 uid="uid://dgs0fqojgcmu3"]
[ext_resource type="Script" uid="uid://ctjy0e806j0vk" path="res://entities/car/car.gd" id="1_nh45c"]
[ext_resource type="PackedScene" uid="uid://drrl25ujbosbr" path="res://entities/car/tron_moto_lowpoly/scene.gltf" id="2_1ang0"]
[sub_resource type="BoxMesh" id="BoxMesh_kkl2f"]
size = Vector3(1, 1, 2)
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_1ang0"]
friction = 0.5
[sub_resource type="BoxShape3D" id="BoxShape3D_76tdi"]
size = Vector3(1, 1, 2)
size = Vector3(1, 1, 2.2)
[sub_resource type="CylinderShape3D" id="CylinderShape3D_yotxw"]
height = 1.1
[node name="Car" type="RigidBody3D"]
mass = 10.0
physics_material_override = SubResource("PhysicsMaterial_1ang0")
script = ExtResource("1_nh45c")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("BoxMesh_kkl2f")
[node name="ForwardLeft" type="RayCast3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0.435121, -1)
[node name="ForwardRight" type="RayCast3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.435121, -1)
[node name="BackwardRight" type="RayCast3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0.435121, 1)
[node name="BackwardLeft" type="RayCast3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0.435121, 1)
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.00250244)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.1)
shape = SubResource("BoxShape3D_76tdi")
[node name="Raycasts" type="Node3D" parent="."]
[node name="CollisionShape3D2" type="CollisionShape3D" parent="."]
transform = Transform3D(-4.37114e-08, 1, -4.37114e-08, 0, -4.37114e-08, -1, -1, -4.37114e-08, 1.91069e-15, 0, 0, 1)
shape = SubResource("CylinderShape3D_yotxw")
[node name="ForwardLeft" type="RayCast3D" parent="Raycasts"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0, -1)
[node name="ForwardRight" type="RayCast3D" parent="Raycasts"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, -1)
[node name="BackwardRight" type="RayCast3D" parent="Raycasts"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 1)
[node name="BackwardLeft" type="RayCast3D" parent="Raycasts"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0, 1)
[node name="CollisionShape3D3" type="CollisionShape3D" parent="."]
transform = Transform3D(-4.37114e-08, 1, -4.37114e-08, 0, -4.37114e-08, -1, -1, -4.37114e-08, 1.91069e-15, 0, 0, -1.2)
shape = SubResource("CylinderShape3D_yotxw")
[node name="RaycastsRespawn" type="Node3D" parent="."]
transform = Transform3D(2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0)
[node name="ForwardLeftRespawn" type="RayCast3D" parent="RaycastsRespawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0, -1)
@ -45,3 +55,11 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 1)
[node name="BackwardLeftRespawn" type="RayCast3D" parent="RaycastsRespawn"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0, 1)
[node name="Sketchfab_Scene" parent="." instance=ExtResource("2_1ang0")]
transform = Transform3D(-0.35, 0, -3.0598e-08, 0, 0.35, 0, 3.0598e-08, 0, -0.35, 0.0317484, -0.52664, 0)
[node name="CameraFollowPoint" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.31962, -2.93594)
[connection signal="body_entered" from="." to="." method="_on_body_entered"]

View file

@ -0,0 +1,11 @@
Model Information:
* title: TRON MOTO LOWPOLY
* source: https://sketchfab.com/3d-models/tron-moto-lowpoly-440eb1d0f37e475ca7eda15517f66552
* author: gedebotax1984 (https://sketchfab.com/gedebotax1984)
Model License:
* license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
* requirements: Author must be credited. Commercial use is allowed.
If you use this 3D model in your project be sure to copy paste this credit wherever you share it:
This work is based on "TRON MOTO LOWPOLY" (https://sketchfab.com/3d-models/tron-moto-lowpoly-440eb1d0f37e475ca7eda15517f66552) by gedebotax1984 (https://sketchfab.com/gedebotax1984) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)

Binary file not shown.

View file

@ -0,0 +1,488 @@
{
"accessors": [
{
"bufferView": 2,
"componentType": 5126,
"count": 5771,
"max": [
1.418189525604248,
-3.2901666164398193,
8.152215957641602
],
"min": [
-2.154029607772827,
-5.40167760848999,
-1.4549527168273926
],
"type": "VEC3"
},
{
"bufferView": 2,
"byteOffset": 69252,
"componentType": 5126,
"count": 5771,
"max": [
1.0,
1.0,
1.0
],
"min": [
-1.0,
-1.0,
-1.0
],
"type": "VEC3"
},
{
"bufferView": 1,
"componentType": 5126,
"count": 5771,
"max": [
0.0,
0.0
],
"min": [
0.0,
0.0
],
"type": "VEC2"
},
{
"bufferView": 0,
"componentType": 5125,
"count": 13137,
"type": "SCALAR"
},
{
"bufferView": 2,
"byteOffset": 138504,
"componentType": 5126,
"count": 3506,
"max": [
44.090858459472656,
9.652633666992188,
34.13569641113281
],
"min": [
-2.5885181427001953,
-40.4989013671875,
-117.7420883178711
],
"type": "VEC3"
},
{
"bufferView": 2,
"byteOffset": 180576,
"componentType": 5126,
"count": 3506,
"max": [
0.9996709823608398,
1.0,
0.9999953508377075
],
"min": [
-0.9996709227561951,
-1.0,
-0.9999963045120239
],
"type": "VEC3"
},
{
"bufferView": 1,
"byteOffset": 46168,
"componentType": 5126,
"count": 3506,
"max": [
1.0,
1.0
],
"min": [
0.0,
0.0
],
"type": "VEC2"
},
{
"bufferView": 0,
"byteOffset": 52548,
"componentType": 5125,
"count": 5856,
"type": "SCALAR"
},
{
"bufferView": 2,
"byteOffset": 222648,
"componentType": 5126,
"count": 6878,
"max": [
3.3031864166259766,
2.111264705657959,
4.73450231552124
],
"min": [
0.1486961841583252,
-0.15285027027130127,
-4.455859184265137
],
"type": "VEC3"
},
{
"bufferView": 2,
"byteOffset": 305184,
"componentType": 5126,
"count": 6878,
"max": [
0.9998899698257446,
1.0,
0.999742329120636
],
"min": [
-0.999989926815033,
-1.0,
-0.9999964237213135
],
"type": "VEC3"
},
{
"bufferView": 1,
"byteOffset": 74216,
"componentType": 5126,
"count": 6878,
"max": [
1.0,
1.0
],
"min": [
0.0,
0.0
],
"type": "VEC2"
},
{
"bufferView": 0,
"byteOffset": 75972,
"componentType": 5125,
"count": 11328,
"type": "SCALAR"
}
],
"asset": {
"extras": {
"author": "gedebotax1984 (https://sketchfab.com/gedebotax1984)",
"license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)",
"source": "https://sketchfab.com/3d-models/tron-moto-lowpoly-440eb1d0f37e475ca7eda15517f66552",
"title": "TRON MOTO LOWPOLY"
},
"generator": "Sketchfab-15.30.0",
"version": "2.0"
},
"bufferViews": [
{
"buffer": 0,
"byteLength": 121284,
"name": "floatBufferViews",
"target": 34963
},
{
"buffer": 0,
"byteLength": 129240,
"byteOffset": 121284,
"byteStride": 8,
"name": "floatBufferViews",
"target": 34962
},
{
"buffer": 0,
"byteLength": 387720,
"byteOffset": 250524,
"byteStride": 12,
"name": "floatBufferViews",
"target": 34962
}
],
"buffers": [
{
"byteLength": 638244,
"uri": "scene.bin"
}
],
"extensionsUsed": [
"KHR_materials_clearcoat",
"KHR_materials_specular"
],
"materials": [
{
"doubleSided": true,
"extensions": {
"KHR_materials_clearcoat": {
"clearcoatFactor": 1.0,
"clearcoatRoughnessFactor": 0.04
},
"KHR_materials_specular": {
"specularColorFactor": [
1.0,
1.0,
1.0
],
"specularFactor": 0.9798125099047921
}
},
"name": "Material",
"pbrMetallicRoughness": {
"baseColorFactor": [
0.001712375681525524,
9.849948610545045e-05,
9.849948610545045e-05,
1.0
],
"metallicFactor": 0.937145713205983,
"roughnessFactor": 0.5
}
},
{
"doubleSided": true,
"extensions": {
"KHR_materials_specular": {
"specularColorFactor": [
1.0,
1.0,
1.0
],
"specularFactor": 1.0
}
},
"name": "Material.003",
"pbrMetallicRoughness": {
"baseColorFactor": [
0.15766773041875703,
0.14889900202474154,
0.14889900202474154,
1.0
],
"roughnessFactor": 0.5
}
},
{
"doubleSided": true,
"extensions": {
"KHR_materials_specular": {
"specularColorFactor": [
1.0,
1.0,
1.0
],
"specularFactor": 1.0
}
},
"name": "Material.002",
"pbrMetallicRoughness": {
"baseColorFactor": [
0.0016820681473392314,
0.7989292457183024,
0.9602083826516892,
1.0
],
"metallicFactor": 0.0,
"roughnessFactor": 0.5
}
}
],
"meshes": [
{
"name": "Object_0",
"primitives": [
{
"attributes": {
"NORMAL": 1,
"POSITION": 0,
"TEXCOORD_0": 2
},
"indices": 3,
"material": 0,
"mode": 4
}
]
},
{
"name": "Object_1",
"primitives": [
{
"attributes": {
"NORMAL": 5,
"POSITION": 4,
"TEXCOORD_0": 6
},
"indices": 7,
"material": 1,
"mode": 4
}
]
},
{
"name": "Object_2",
"primitives": [
{
"attributes": {
"NORMAL": 9,
"POSITION": 8,
"TEXCOORD_0": 10
},
"indices": 11,
"material": 2,
"mode": 4
}
]
}
],
"nodes": [
{
"children": [
1
],
"matrix": [
1.0,
0.0,
0.0,
0.0,
0.0,
2.220446049250313e-16,
-1.0,
0.0,
0.0,
1.0,
2.220446049250313e-16,
0.0,
0.0,
0.0,
0.0,
1.0
],
"name": "Sketchfab_model"
},
{
"children": [
2
],
"name": "root"
},
{
"children": [
3,
5,
7
],
"matrix": [
1.0,
0.0,
0.0,
0.0,
0.0,
2.220446049250313e-16,
1.0,
0.0,
0.0,
-1.0,
2.220446049250313e-16,
0.0,
0.0,
0.0,
0.0,
1.0
],
"name": "GLTF_SceneRootNode"
},
{
"children": [
4
],
"matrix": [
0.0,
-1.0,
-0.0,
0.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.0,
0.0,
4.363928318023682,
1.355409860610962,
-2.9339444637298584,
1.0
],
"name": "Circle.005_1"
},
{
"mesh": 0,
"name": "Object_4"
},
{
"children": [
6
],
"matrix": [
0.0,
-0.05666607618331909,
0.0,
0.0,
0.05666607618331909,
0.0,
0.0,
0.0,
0.0,
0.0,
0.05666607618331909,
0.0,
0.8766956329345703,
2.729276180267334,
2.7074050903320313,
1.0
],
"name": "Cylinder.001_2"
},
{
"mesh": 1,
"name": "Object_6"
},
{
"children": [
8
],
"matrix": [
0.0,
-1.0,
0.0,
0.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.0,
0.0,
-0.9677443504333496,
3.4250857830047607,
0.49128252267837524,
1.0
],
"name": "Circle.025_3"
},
{
"mesh": 2,
"name": "Object_8"
}
],
"scene": 0,
"scenes": [
{
"name": "Sketchfab_Scene",
"nodes": [
0
]
}
]
}

View file

@ -0,0 +1,37 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://drrl25ujbosbr"
path="res://.godot/imported/scene.gltf-0f2cf150bf6291a4d643a4542d4a3400.scn"
[deps]
source_file="res://entities/car/tron_moto_lowpoly/scene.gltf"
dest_files=["res://.godot/imported/scene.gltf-0f2cf150bf6291a4d643a4542d4a3400.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

View file

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://cu5r7oxtqa2c0"]
[ext_resource type="Script" uid="uid://dp4qacjfhtyul" path="res://entities/checkpoint/check_point_manager.gd" id="1_g2cn0"]
[node name="CheckPointManager" type="Node"]
script = ExtResource("1_g2cn0")

View file

@ -0,0 +1,29 @@
extends Node
@export var nb_checkpoints := 5
@export var max_lap := 3
var current_checkpoint := 0
var current_lap := 0
func checkPointEnter(check_point_id):
if check_point_id != current_checkpoint:
print("not good checkpoint")
return
if check_point_id == 0:
current_lap += 1
current_checkpoint = 1
print("new lap")
else:
current_checkpoint += 1
print(current_checkpoint)
if (current_lap == max_lap):
endTrack()
return
func endTrack():
print("end")
current_lap = 0
current_checkpoint = 0

View file

@ -0,0 +1 @@
uid://dp4qacjfhtyul

View file

@ -0,0 +1,14 @@
extends Area3D
class_name CheckPoint
@export var check_point_id : int = 0
func _on_body_entered(body: Node3D) -> void:
if body is not Car:
return
CheckPointManager.checkPointEnter(check_point_id)

View file

@ -0,0 +1 @@
uid://dxswi3yuxexve

View file

@ -0,0 +1,22 @@
[gd_scene load_steps=5 format=3 uid="uid://caolvlv4uvi04"]
[ext_resource type="Script" uid="uid://dxswi3yuxexve" path="res://entities/checkpoint/checkpoint.gd" id="1_ywa0e"]
[ext_resource type="Material" uid="uid://5vg20wpsk85u" path="res://entities/checkpoint/checkpoint_mat.tres" id="2_ha6r5"]
[sub_resource type="BoxShape3D" id="BoxShape3D_gkifo"]
size = Vector3(15, 5, 1)
[sub_resource type="BoxMesh" id="BoxMesh_ywa0e"]
material = ExtResource("2_ha6r5")
size = Vector3(15, 5, 1)
[node name="Checkpoint" type="Area3D"]
script = ExtResource("1_ywa0e")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("BoxShape3D_gkifo")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("BoxMesh_ywa0e")
[connection signal="body_entered" from="." to="." method="_on_body_entered"]

View file

@ -0,0 +1,5 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://5vg20wpsk85u"]
[resource]
transparency = 1
albedo_color = Color(0.396078, 1, 0.686275, 0.270588)

View file

@ -2,6 +2,7 @@
extends Path3D
class_name RoadPath
@export_tool_button("update_control_points") var action = update_control_points
var tilt_scale : float = 0.0005
func modulo_get_point_position(i):
return curve.get_point_position(posmod(i, curve.point_count))
@ -10,14 +11,6 @@ func update_control_points():
if curve.point_count < 2:
return
#
## Start point: out control based on next point
#var dir = (curve.get_point_position(1) - curve.get_point_position(0)).normalized()
#var tangent_length = dir.length() / 3
#
#curve.set_point_out(0, dir * tangent_length)
# Intermediate points: in and out controls based on adjacent points
for i in range(0, curve.point_count):
var prev = modulo_get_point_position(i) - modulo_get_point_position(i - 1)
var next = modulo_get_point_position(i + 1) - modulo_get_point_position(i)
@ -30,3 +23,6 @@ func update_control_points():
tangent = tangent.normalized()
curve.set_point_in(i, -tangent * tangent_length)
curve.set_point_out(i, tangent * tangent_length)
var tilt = -prev.cross(next).y * tilt_scale
curve.set_point_tilt(i, tilt)

View file

@ -32,10 +32,11 @@ func generate_mesh():
var race_length = curve.get_baked_length()
var nb_of_point : int = race_length / segment_length
for i in range(nb_of_point):
for i in range(nb_of_point+1):
var dist1 = float(i) * segment_length
var dist2 = float(i + 1) * segment_length
var t1 := curve.sample_baked_with_rotation(dist1, true)
var t2 := curve.sample_baked_with_rotation(dist2, true)
@ -52,8 +53,6 @@ func generate_mesh():
var up2 = t2.basis.y.normalized()
var p1 := t1.origin
if i == 0:
p1 += fwd1 * 0.05
var p2 := t2.origin
# Top vertices
@ -68,48 +67,77 @@ func generate_mesh():
var p2_right_bottom = p2_right - up2 * road_thickness
var p2_left_bottom = p2_left - up2 * road_thickness
# Top face
create_rectangle(p1_right, p1_left, p2_left, p2_right, up1, up2, Vector2(0, dist1 / road_width), Vector2(1, dist2 / road_width))
# Top face
create_rectangle(
p1_right, p1_left, p2_left, p2_right,
up1, up2,
Vector2(1, dist1 / road_width),
Vector2(0, dist1 / road_width),
Vector2(0, dist2 / road_width),
Vector2(1, dist2 / road_width)
)
# Bottom face (inverted normal)
create_rectangle(p1_left_bottom, p1_right_bottom, p2_right_bottom, p2_left_bottom, up1, up2, Vector2(1, dist1 / road_width), Vector2(0, dist2 / road_width))
# Bottom face
create_rectangle(
p1_left_bottom, p1_right_bottom, p2_right_bottom, p2_left_bottom,
-up1, -up2,
Vector2(0, dist1 / road_width),
Vector2(1, dist1 / road_width),
Vector2(1, dist2 / road_width),
Vector2(0, dist2 / road_width)
)
# Right side face
create_rectangle(p1_right_bottom, p1_right, p2_right, p2_right_bottom, right1, right2, Vector2(dist1 / road_thickness, 0), Vector2(dist2 / road_thickness, 1))
create_rectangle(
p1_right_bottom, p1_right, p2_right, p2_right_bottom,
right1, right2,
Vector2(dist1 / road_thickness, 0),
Vector2(dist1 / road_thickness, 1),
Vector2(dist2 / road_thickness, 1),
Vector2(dist2 / road_thickness, 0)
)
# Left side face
create_rectangle(p1_left, p1_left_bottom, p2_left_bottom, p2_left, left1, left2, Vector2(dist1 / road_thickness, 0), Vector2(dist2 / road_thickness, 1))
create_rectangle(
p1_left, p1_left_bottom, p2_left_bottom, p2_left,
left1, left2,
Vector2(dist1 / road_thickness, 1),
Vector2(dist1 / road_thickness, 0),
Vector2(dist2 / road_thickness, 0),
Vector2(dist2 / road_thickness, 1)
)
var final_mesh = st_road.commit()
road_mesh_instance.mesh = final_mesh
var shape = final_mesh.create_trimesh_shape()
road_shape.shape = shape
func create_rectangle(
v1: Vector3, v2: Vector3, v3: Vector3, v4: Vector3,
normal1: Vector3, normal2: Vector3,
uv1: Vector2, uv2: Vector2
uv1: Vector2, uv2: Vector2, uv3: Vector2, uv4: Vector2
):
# Triangle 1
st_road.set_uv(uv1)
st_road.set_normal(normal1)
st_road.add_vertex(v1)
st_road.set_uv(Vector2(uv1.x, uv2.y))
st_road.set_uv(uv2)
st_road.set_normal(normal1)
st_road.add_vertex(v2)
st_road.set_uv(uv2)
st_road.set_uv(uv3)
st_road.set_normal(normal2)
st_road.add_vertex(v3)
# Triangle 2
st_road.set_uv(uv2)
st_road.set_uv(uv3)
st_road.set_normal(normal2)
st_road.add_vertex(v3)
st_road.set_uv(Vector2(uv2.x, uv1.y))
st_road.set_uv(uv4)
st_road.set_normal(normal1)
st_road.add_vertex(v4)

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,16 @@
[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://qq8yw26i32k4"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_ma6g7"]
noise_type = 2
domain_warp_enabled = true
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_l5fpm"]
seamless = true
as_normal_map = true
bump_strength = 2.0
noise = SubResource("FastNoiseLite_ma6g7")
[resource]
albedo_color = Color(0.635294, 0.568627, 1, 1)
normal_enabled = true
normal_texture = SubResource("NoiseTexture2D_l5fpm")

View file

@ -4,9 +4,10 @@
[sub_resource type="Curve3D" id="Curve3D_p7e7j"]
closed = true
bake_interval = 0.01
_data = {
"points": PackedVector3Array(0.246495, 0, 4.21189, -0.246495, 0, -4.21189, 0, 0, 0, -4.24042, 0, 0.00829778, 4.24042, 0, -0.00829778, 10, 0, -7.75931, -4.21783, 0, -0.014848, 4.21783, 0, 0.014848, 20, 1.27448, 0, -4.24638, 0, 0.0109491, 4.24638, 0, -0.0109491, 30, 0, -7.64779, -2.44782, 0, -6.85357, 2.44782, 0, 6.85357, 40, 1.9489, 0, 12.6025, 0, -5.29505, -12.6025, 0, 5.29505, 35.1108, 0, 21.1888),
"tilts": PackedFloat32Array(0, 0, 0, 0, 0, 0)
"points": PackedVector3Array(0.246496, 0, 4.21189, -0.246496, 0, -4.21189, 0, 0, 0, -4.54407, 0, 0.13149, 4.54407, 0, -0.13149, 10, 0, -7.75931, -4.52489, 0, -0.0171429, 4.52489, 0, 0.0171429, 20, 5.07796, 0, -4.24514, 0, -0.103093, 4.24514, 0, 0.103093, 30, 0, -7.64779, -2.44781, 0, -6.85356, 2.44781, 0, 6.85356, 40, 1.9489, 0, 12.6025, 0, -5.29503, -12.6025, 0, 5.29503, 35.1108, 0, 21.1888),
"tilts": PackedFloat32Array(0.242162, 0.0775931, -0.0770355, 0.0764779, 0.12464, 0.423776)
}
point_count = 6

View file

@ -0,0 +1,3 @@
[gd_resource type="PhysicsMaterial" format=3 uid="uid://xghhl0tserq3"]
[resource]

10
entities/sky/sky.gdshader Normal file
View file

@ -0,0 +1,10 @@
shader_type sky;
uniform vec3 color_env : source_color;
uniform sampler2D noise_texture : repeat_enable;
uniform float noise_power;
uniform float speed;
void sky() {
COLOR = color_env * ((1.0+EYEDIR.y)/2.0) + noise_power*texture(noise_texture, SKY_COORDS + vec2(TIME*speed, 0)).xyz;
}

View file

@ -0,0 +1 @@
uid://tqpr7f3nr72k

View file

@ -15,6 +15,10 @@ run/main_scene="uid://bd8skoxlvujam"
config/features=PackedStringArray("4.4", "GL Compatibility")
config/icon="res://icon.svg"
[autoload]
CheckPointManager="*res://entities/checkpoint/check_point_manager.gd"
[input]
forward={
@ -49,7 +53,10 @@ restart={
[physics]
3d/run_on_separate_thread=true
3d/physics_engine="Jolt Physics"
3d/default_gravity=20.0
3d/solver/contact_max_allowed_penetration=0.05
[rendering]

File diff suppressed because one or more lines are too long