From a96673ceb6caca2db0ee63895bb95d6679abc82f Mon Sep 17 00:00:00 2001 From: Segey Lapin Date: Sat, 13 Nov 2021 16:53:14 +0300 Subject: [PATCH] Spawn operation for buildings at block level --- autoload/streaming.gd | 106 ++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 62 deletions(-) diff --git a/autoload/streaming.gd b/autoload/streaming.gd index da8e548..6939054 100644 --- a/autoload/streaming.gd +++ b/autoload/streaming.gd @@ -49,6 +49,16 @@ onready var palace_map_data = { "tower_roof_tile": tower_roof_tile } +onready var buildings = { + "trailer_house": preload("res://buildings/trailer-house.gd").new() +} + +func spawn_building(bname: String, xform: Transform) -> void: + if !buildings.has(bname): + return + var objects = buildings[bname].build_house(xform) + spawn_house_objects(xform, objects) + var traffic_rnd: RandomNumberGenerator var traffic_astar: AStar @@ -97,7 +107,7 @@ func setup_town(site): ok = false if ok: var xform = Transform(Basis(), pstart).looking_at(pstart + d, Vector3.UP) - stream_obj("trailer_house", xform) + spawn_building("trailer_house", xform) var aabb = AABB(pstart, Vector3()) aabb = aabb.grow(32) aabbs.push_back(aabb) @@ -169,7 +179,8 @@ func setup_first_town(): ok = false if ok: var xform = Transform(Basis(), pstart).looking_at(pstart + d, Vector3.UP) - stream_obj("trailer_house", xform) +# stream_obj("trailer_house", xform) + spawn_building("trailer_house", xform) var aabb = AABB(pstart, Vector3()) aabb = aabb.grow(32) aabbs.push_back(aabb) @@ -237,11 +248,15 @@ func _ready(): } for k in parts.keys(): Spawner.add_scene(k, parts[k]) - Traffic.set_min_spawn_distance(50.0) +# Traffic.set_min_spawn_distance(50.0) # Traffic.set_deny_physics() - Traffic.set_physics_distance(Vector3(30, -10, 40)) +# Traffic.set_physics_distance(Vector3(30, -10, 40)) # Traffic.set_debug(true) + Traffic.set_spawn_cooldown(1, 5) + Traffic.set_default_speed(8.5) Traffic.add_traffic_vehicle(car) + var water_mat = load("res://water/Water.material") + Water.set_material(water_mat) var delay = 3.0 var state = 0 @@ -252,7 +267,7 @@ func _process(delta): if delay < 0: state = 1 1: - Spawner.update_view(self, 200) +# Spawner.update_view(self, 200) var sc = get_tree().root var viewport: = get_viewport() if !viewport: @@ -262,7 +277,7 @@ func _process(delta): return var cam_xform: = cam.global_transform # building parts - call_deferred("real_spawn_child") +# call_deferred("real_spawn_child") func stream_obj(obj: String, xform: Transform): Spawner.place_scene(obj, xform) @@ -272,53 +287,6 @@ func _physics_process(delta): return match state: 1: - # convert to distant traffic here - for n in get_tree().get_nodes_in_group("traffic_vehicle"): - var p1 = cam.global_transform.origin - var p2 = n.global_transform.origin - # p2 has both vertical and lane offset, correct these and write to path_pos - var path_pos = Traffic.get_path_position(n) - var check_coords = cam.global_transform.xform_inv(path_pos) - var steer = 0.0 - var orientation = n.global_transform - orientation.origin = Vector3() - var direction = orientation.xform(Vector3(0, 0, -1)) - var good_path = false - var engine_force = n.engine_force - if !n.has_meta("curve"): - continue - if n.has_meta("curve"): - # next_target has corrected vertical position (up from path) - steer = Traffic.get_steer(n, true) * 0.6 - if !n.has_meta("space"): - var v = n.get_linear_velocity() - var l = v.length() - print("physics: velocity: ", v, " velocity norm: ", v.normalized()) - if true: - if abs(steer) > 3.0: - engine_force *= 0.9 - engine_force = clamp(engine_force, 2500.0, max(2500, engine_force)) - else: - if abs(steer) > 4.0 && l > 5.0: - engine_force = engine_force * 0.9996 - if l > 7.0: - engine_force = engine_force * 0.9996 - elif l < 1.1: - engine_force = clamp(engine_force * 1.004, 6000, 8000) - elif l < 2.5: - engine_force = clamp(engine_force * 1.002, 5000, 7000) - elif l < 5.0: - engine_force = clamp(engine_force * 1.001, 4000, 6000) - elif l < 6.0: - engine_force = clamp(engine_force * 1.001, 3000, 5000) - engine_force = clamp(engine_force, 0, 3500) -# print("engine_force: ", engine_force) - n.engine_force = engine_force - n.brake = 0 - var base_steering = n.steering - var main_steering = base_steering * 0.95 + steer * 0.05 - n.steering = clamp(main_steering, -1, 1) - n.set_meta("steering", n.steering) var space_state = get_viewport().get_world().direct_space_state # probaly should not be here for n in get_tree().get_nodes_in_group("spawn"): @@ -353,17 +321,13 @@ func _physics_process(delta): # buildings -var spawn = [] +#var spawn = [] +onready var spawn_lock: Mutex = Mutex.new() func spawn_child(n: String, xform: Transform) -> void: - var sp = {"node": n, "xform": xform} - spawn.push_back(sp) -func real_spawn_child(): - var count = 0 - while spawn.size() > 0: - var e = spawn.pop_front() - Spawner.place_scene(e.node, e.xform) - count += 1 + spawn_lock.lock() + Spawner.queue_place_scene(n, xform) + spawn_lock.unlock() func update_node_position(n): var space_state = get_viewport().get_world().direct_space_state @@ -377,3 +341,21 @@ func update_node_position(n): return else: n.global_transform.origin = result.position + +func spawn_house_objects(place: Transform, objects) -> void: + for obj in objects: + var x = obj.xform + for w in obj.data: + if w.ends_with("_rotated"): + x.basis = x.basis.rotated(Vector3(0, 1, 0), PI) + var n = w.replace("_rotated", "") + spawn_child(n, place * x) + else: + spawn_child(w, place * x) + +static func get_place_rnd(xform: Transform): + var rnd = RandomNumberGenerator.new() + var s = int(xform.origin.x + 100 * xform.origin.z * 2) % 0x1ffffff + rnd.seed = s + return rnd +