Traffic implementation

This commit is contained in:
Segey Lapin
2021-11-01 14:27:27 +03:00
parent ba2444b592
commit daece19b55
9 changed files with 644 additions and 375 deletions

View File

@@ -1,124 +1,70 @@
extends Spatial
var side_wall: PackedScene = preload("res://objects/wall-side.scn")
var bottom_side: PackedScene = preload("res://objects/bottom-side.scn")
var bottom: PackedScene = preload("res://objects/bottom.scn")
var bottom_wheels: PackedScene = preload("res://objects/bottom-wheels.scn")
var entry: PackedScene = preload("res://objects/entry.scn")
var roof_floor: PackedScene = preload("res://objects/roof-floor.scn")
var roof_floor_range: PackedScene = preload("res://objects/roof-floor-range.scn")
var wall_internal: PackedScene = preload("res://objects/wall-internal.scn")
var window_narrow: PackedScene = preload("res://objects/window-narrow.scn")
var window_wide: PackedScene = preload("res://objects/window-wide.scn")
var wall_solid: PackedScene = preload("res://objects/wall-solid.scn")
onready var rnd = RandomNumberGenerator.new()
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var thread: Thread
var spawn = []
func _ready():
thread = Thread.new()
# var parts = {
# "side_wall": side_wall,
# "bottom_side": bottom_side,
# "bottom": bottom,
# "bottom_wheels": bottom_wheels,
# "entry": entry,
# "roof_floor": roof_floor,
# "roof_floor_range": roof_floor_range,
# "wall_internal": wall_internal,
# "window_narrow": window_narrow,
# "window_wide": window_wide,
# "wall_solid": wall_solid
# }
# for k in parts.keys():
# Spawner.add_scene(k, parts[k])
func _exit_tree():
if thread.is_active():
thread.wait_to_finish()
func spawn_child(n, xform):
add_child(n)
n.transform = xform
func build_house(userdata):
var s = int(global_transform.origin.x + 100 * global_transform.origin.z * 2) % 0x1ffffff
pass
func spawn_child(n: String, xform: Transform) -> void:
var x = xform
if n.ends_with("_rotated"):
x.basis = x.basis.rotated(Vector3(0, 1, 0), PI)
n = n.replace("_rotated", "")
streaming.spawn_child(n, global_transform * x)
static func build_house(main_xform: Transform):
var rnd = RandomNumberGenerator.new()
var s = int(main_xform.origin.x + 100 * main_xform.origin.z * 2) % 0x1ffffff
rnd.seed = s
print(global_transform.origin, " seed = ", s)
print(main_xform.origin, " seed = ", s)
var l = 6 + 2 * rnd.randi() % 7 - 1
var h = l - 1
var d = 3 + rnd.randi() % (l - 5 + 1)
var range_used = false
var objects = []
for k in range(l + 1):
var pos = Vector3(0, 0, k * 2)
var xform = Transform(Basis(), pos)
if k > 0:
var what
if k != d && rnd.randf() > 0.5 && !range_used:
var r = roof_floor_range.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", r, xform)
what = "roof_floor_range"
range_used = true
else:
var r = roof_floor.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", r, xform)
var what
what = "roof_floor"
objects.push_back({"xform": xform, "data": [what]})
var xt = [Transform(Basis(), pos), Transform(Basis().rotated(Vector3.UP, PI), pos - Vector3(0, 0, 2))]
for x in range(xt.size()):
if x == 0 && k == d:
continue
if rnd.randf() > 0.5:
what = wall_solid.instance()
what = "wall_solid"
elif rnd.randf() > 0.5:
what = window_narrow.instance()
what = "window_narrow"
else:
what = window_wide.instance()
call_deferred("spawn_child", what, xt[x])
what = "window_wide"
objects.push_back({"xform": xt[x], "data": [what]})
var obj_data = []
if k > 1 && k < l && rnd.randf() > 0.6:
var r = wall_internal.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", r, xform)
objects.push_back({"xform": xform, "data": ["wall_internal"]})
match k:
0:
var b = side_wall.instance()
var c = bottom_side.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
call_deferred("spawn_child", c, xform)
obj_data = ["side_wall", "bottom_side"]
1:
var b = bottom.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
obj_data = ["bottom"]
2:
var b = bottom_wheels.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
obj_data = ["bottom_wheels"]
d:
var b = entry.instance()
var c = bottom.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
call_deferred("spawn_child", c, xform)
obj_data = ["entry", "bottom"]
h:
var b = bottom_wheels.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
obj_data = ["bottom_wheels"]
l:
var b = side_wall.instance()
var c = bottom_side.instance()
var a = bottom.instance()
var xform = Transform(Basis().rotated(Vector3(0, 1, 0), PI), pos)
var xform2 = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
call_deferred("spawn_child", c, xform)
call_deferred("spawn_child", a, xform2)
obj_data = ["side_wall_rotated", "bottom_side_rotated", "bottom"]
_:
var b = bottom.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
obj_data = ["bottom"]
objects.push_back({"xform": xform, "data": obj_data})
return objects
# Called every frame. 'delta' is the elapsed time since the previous frame.
var state = 0
func _process(delta):
@@ -126,26 +72,20 @@ func _process(delta):
0:
state = 1
1:
build_house(self)
var objects = build_house(global_transform)
for obj in objects:
var x = obj.xform
for w in obj.data:
call_deferred("spawn_child", w, x)
state = 2
var prev = 3000000
func _physics_process(delta):
var cam = get_viewport().get_camera()
var dst = cam.global_transform.origin.distance_to(global_transform.origin)
match state:
2:
if abs(prev - dst) > 20:
var space_state = get_viewport().get_world().direct_space_state
var where = get_global_transform().origin
var from = where
var to = where
from.y -= 8.0
to.y += 8.0
var result = space_state.intersect_ray(from, to)
if result.empty() || !result.has("collider"):
return
else:
global_transform.origin = result.position
prev = dst
set_process(false)
#var prev = 3000000
#func _physics_process(delta):
# var cam = get_viewport().get_camera()
# var dst = cam.global_transform.origin.distance_squared_to(global_transform.origin)
# match state:
# 2:
# if abs(prev - dst) > 400:
# streaming.update_node_position(n)