Spawn operation for buildings at block level
This commit is contained in:
@@ -49,6 +49,16 @@ onready var palace_map_data = {
|
|||||||
"tower_roof_tile": tower_roof_tile
|
"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_rnd: RandomNumberGenerator
|
||||||
var traffic_astar: AStar
|
var traffic_astar: AStar
|
||||||
@@ -97,7 +107,7 @@ func setup_town(site):
|
|||||||
ok = false
|
ok = false
|
||||||
if ok:
|
if ok:
|
||||||
var xform = Transform(Basis(), pstart).looking_at(pstart + d, Vector3.UP)
|
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())
|
var aabb = AABB(pstart, Vector3())
|
||||||
aabb = aabb.grow(32)
|
aabb = aabb.grow(32)
|
||||||
aabbs.push_back(aabb)
|
aabbs.push_back(aabb)
|
||||||
@@ -169,7 +179,8 @@ func setup_first_town():
|
|||||||
ok = false
|
ok = false
|
||||||
if ok:
|
if ok:
|
||||||
var xform = Transform(Basis(), pstart).looking_at(pstart + d, Vector3.UP)
|
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())
|
var aabb = AABB(pstart, Vector3())
|
||||||
aabb = aabb.grow(32)
|
aabb = aabb.grow(32)
|
||||||
aabbs.push_back(aabb)
|
aabbs.push_back(aabb)
|
||||||
@@ -237,11 +248,15 @@ func _ready():
|
|||||||
}
|
}
|
||||||
for k in parts.keys():
|
for k in parts.keys():
|
||||||
Spawner.add_scene(k, parts[k])
|
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_deny_physics()
|
||||||
Traffic.set_physics_distance(Vector3(30, -10, 40))
|
# Traffic.set_physics_distance(Vector3(30, -10, 40))
|
||||||
# Traffic.set_debug(true)
|
# Traffic.set_debug(true)
|
||||||
|
Traffic.set_spawn_cooldown(1, 5)
|
||||||
|
Traffic.set_default_speed(8.5)
|
||||||
Traffic.add_traffic_vehicle(car)
|
Traffic.add_traffic_vehicle(car)
|
||||||
|
var water_mat = load("res://water/Water.material")
|
||||||
|
Water.set_material(water_mat)
|
||||||
|
|
||||||
var delay = 3.0
|
var delay = 3.0
|
||||||
var state = 0
|
var state = 0
|
||||||
@@ -252,7 +267,7 @@ func _process(delta):
|
|||||||
if delay < 0:
|
if delay < 0:
|
||||||
state = 1
|
state = 1
|
||||||
1:
|
1:
|
||||||
Spawner.update_view(self, 200)
|
# Spawner.update_view(self, 200)
|
||||||
var sc = get_tree().root
|
var sc = get_tree().root
|
||||||
var viewport: = get_viewport()
|
var viewport: = get_viewport()
|
||||||
if !viewport:
|
if !viewport:
|
||||||
@@ -262,7 +277,7 @@ func _process(delta):
|
|||||||
return
|
return
|
||||||
var cam_xform: = cam.global_transform
|
var cam_xform: = cam.global_transform
|
||||||
# building parts
|
# building parts
|
||||||
call_deferred("real_spawn_child")
|
# call_deferred("real_spawn_child")
|
||||||
|
|
||||||
func stream_obj(obj: String, xform: Transform):
|
func stream_obj(obj: String, xform: Transform):
|
||||||
Spawner.place_scene(obj, xform)
|
Spawner.place_scene(obj, xform)
|
||||||
@@ -272,53 +287,6 @@ func _physics_process(delta):
|
|||||||
return
|
return
|
||||||
match state:
|
match state:
|
||||||
1:
|
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
|
var space_state = get_viewport().get_world().direct_space_state
|
||||||
# probaly should not be here
|
# probaly should not be here
|
||||||
for n in get_tree().get_nodes_in_group("spawn"):
|
for n in get_tree().get_nodes_in_group("spawn"):
|
||||||
@@ -353,17 +321,13 @@ func _physics_process(delta):
|
|||||||
|
|
||||||
# buildings
|
# buildings
|
||||||
|
|
||||||
var spawn = []
|
#var spawn = []
|
||||||
|
onready var spawn_lock: Mutex = Mutex.new()
|
||||||
|
|
||||||
func spawn_child(n: String, xform: Transform) -> void:
|
func spawn_child(n: String, xform: Transform) -> void:
|
||||||
var sp = {"node": n, "xform": xform}
|
spawn_lock.lock()
|
||||||
spawn.push_back(sp)
|
Spawner.queue_place_scene(n, xform)
|
||||||
func real_spawn_child():
|
spawn_lock.unlock()
|
||||||
var count = 0
|
|
||||||
while spawn.size() > 0:
|
|
||||||
var e = spawn.pop_front()
|
|
||||||
Spawner.place_scene(e.node, e.xform)
|
|
||||||
count += 1
|
|
||||||
|
|
||||||
func update_node_position(n):
|
func update_node_position(n):
|
||||||
var space_state = get_viewport().get_world().direct_space_state
|
var space_state = get_viewport().get_world().direct_space_state
|
||||||
@@ -377,3 +341,21 @@ func update_node_position(n):
|
|||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
n.global_transform.origin = result.position
|
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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user