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

@ -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]