Spawn operation for buildings at block level

This commit is contained in:
Segey Lapin
2021-11-13 16:53:14 +03:00
parent 4ba2898ec2
commit a96673ceb6

View File

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