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 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 rnd.seed = s print(global_transform.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 for k in range(l + 1): var pos = Vector3(0, 0, k * 2) if k > 0: 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) range_used = true else: var r = roof_floor.instance() var xform = Transform(Basis(), pos) call_deferred("spawn_child", r, xform) var 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() elif rnd.randf() > 0.5: what = window_narrow.instance() else: what = window_wide.instance() call_deferred("spawn_child", what, xt[x]) 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) 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) 1: var b = bottom.instance() var xform = Transform(Basis(), pos) call_deferred("spawn_child", b, xform) 2: var b = bottom_wheels.instance() var xform = Transform(Basis(), pos) call_deferred("spawn_child", b, xform) 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) h: var b = bottom_wheels.instance() var xform = Transform(Basis(), pos) call_deferred("spawn_child", b, xform) 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) _: var b = bottom.instance() var xform = Transform(Basis(), pos) call_deferred("spawn_child", b, xform) # Called every frame. 'delta' is the elapsed time since the previous frame. var state = 0 func _process(delta): match state: 0: state = 1 1: build_house(self) 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