diff --git a/autoload/streaming.gd b/autoload/streaming.gd index 0ce8a79..62eefc7 100644 --- a/autoload/streaming.gd +++ b/autoload/streaming.gd @@ -11,104 +11,145 @@ onready var obj_names = { var done = false -class radial_grid: - var radial_points = [] - var max_r = 0.0 - var grid = [] - var width: int = 0 - var height: int = 0 - var nodes = [] - func build(poly, center): - var height = center.y - max_r = 0.0 - for p in range(poly.size()): - var ep1 = poly[p] - ep1.y = height - var ep2 = poly[(p + 1) % poly.size()] - ep2.y = height - var d = (ep2 - ep1).normalized() - radial_points.push_back(ep1) - var dst = ep1.distance_to(ep2) - while dst > 32: - ep1 += d * 32 - radial_points.push_back(ep1) - dst -= 32 - for p in range(radial_points.size()): - var ep = radial_points[p] - var dst = ep.distance_to(center) - if max_r < dst: - max_r = dst - width = radial_points.size() - height = int(max_r / 32) - grid.resize(width * height) - for p in range(width): - var start = radial_points[p] - var end = center - var step = (end - start).normalized() * (end - start).length() / float(height + 1) - var val = start - for q in range(height): - grid[p * height + q] = {"position": val, "node": null} - func get_grid_node(x, y): - return grid[x * height + y].node - func set_grid_node(x, y, node): - if !node in nodes: - nodes.push_back(node) - grid[x * height + y].node = node - func place_grid(aabb: AABB, node) -> void: - for u in range(width): - for v in range(height): - if aabb.has_point(grid[u * height + v].position): - set_grid_node(u, v, node) - func get_pos(x, y): - return grid[x * height + y].position +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 grid = radial_grid.new() +var courtyard_tile: PackedScene = preload("res://objects/courtyard-tile.scn") +var foundation_tile: PackedScene = preload("res://objects/foundation.scn") +var room_tile: PackedScene = preload("res://objects/block-room-corridoor.scn") +var tower_walls_tile: PackedScene = preload("res://objects/tower-walls.scn") +var tower_floor_tile: PackedScene = preload("res://objects/tower_floor.scn") +var stairs_tile: PackedScene = preload("res://objects/stairs.scn") +var gate_bottom_tile: PackedScene = preload("res://objects/gate_bottom.scn") +var gate_top_tile: PackedScene = preload("res://objects/gate-top.scn") +var entry_tile: PackedScene = preload("res://objects/block-room-entry.scn") +var roof_tile: PackedScene = preload("res://objects/roof.scn") +var tower_roof_tile: PackedScene = preload("res://objects/tower-roof.scn") -func debug_poly(poly): - for k in range(poly.size()): - var p1 = poly[k] - var p2 = poly[(k + 1) % poly.size()] - var l = p1.distance_to(p2) - var d = (p2 - p1).normalized() - var pt = p1 - while l > 0.0: - for e in range(0, 30, 2): - var mi = MeshInstance.new() - mi.mesh = CubeMesh.new() - get_tree().root.add_child(mi) - mi.global_transform.origin = pt + Vector3(0, e, 0) - pt += d * 5.0 - l -= 5.0 +onready var palace_map_data = { + "courtyard_tile": courtyard_tile, + "foundation_tile": foundation_tile, + "room_tile": room_tile, + "tower_walls_tile": tower_walls_tile, + "tower_floor_tile": tower_floor_tile, + "stairs_tile": stairs_tile, + "gate_bottom_tile": gate_bottom_tile, + "gate_top_tile": gate_top_tile, + "entry_tile": entry_tile, + "roof_tile": roof_tile, + "tower_roof_tile": tower_roof_tile +} -func calc_border(poly, offt): - var height = RoadsData.get_site_avg_height(0) - var border = [] - border.resize(poly.size()) - for k in range(poly.size()): - var i = k - 1 - if i < 0: - i += poly.size() - var p1 = poly[i] - var p2 = poly[k] - var p3 = poly[(k + 1) % poly.size()] - var p1x = Vector2(p1.x, p1.z) - var p2x = Vector2(p2.x, p2.z) - var p3x = Vector2(p2.x, p2.z) - var p4x = Vector2(p3.x, p3.z) - var n1 = (p2x - p1x).tangent().normalized() - var n2 = (p4x - p3x).tangent().normalized() - p1x -= n1 * offt - p2x -= n1 * offt - p3x -= n2 * offt - p4x -= n2 * offt - var xp = Geometry.segment_intersects_segment_2d(p1x, p2x, p3x, p4x) - if !xp: - xp = p2x.linear_interpolate(p3x, 0.5) - (n1 + n2).normalized() * offt - var tp = Vector3(xp.x, height, xp.y) - border[k] = tp - return border +#class radial_grid: +# var radial_points = [] +# var max_r = 0.0 +# var grid = [] +# var width: int = 0 +# var height: int = 0 +# var nodes = [] +# func build(poly, center): +# var height = center.y +# max_r = 0.0 +# for p in range(poly.size()): +# var ep1 = poly[p] +# ep1.y = height +# var ep2 = poly[(p + 1) % poly.size()] +# ep2.y = height +# var d = (ep2 - ep1).normalized() +# radial_points.push_back(ep1) +# var dst = ep1.distance_to(ep2) +# while dst > 32: +# ep1 += d * 32 +# radial_points.push_back(ep1) +# dst -= 32 +# for p in range(radial_points.size()): +# var ep = radial_points[p] +# var dst = ep.distance_to(center) +# if max_r < dst: +# max_r = dst +# width = radial_points.size() +# height = int(max_r / 32) +# grid.resize(width * height) +# for p in range(width): +# var start = radial_points[p] +# var end = center +# var step = (end - start).normalized() * (end - start).length() / float(height + 1) +# var val = start +# for q in range(height): +# grid[p * height + q] = {"position": val, "node": null} +# func get_grid_node(x, y): +# return grid[x * height + y].node +# func set_grid_node(x, y, node): +# if !node in nodes: +# nodes.push_back(node) +# grid[x * height + y].node = node +# func place_grid(aabb: AABB, node) -> void: +# for u in range(width): +# for v in range(height): +# if aabb.has_point(grid[u * height + v].position): +# set_grid_node(u, v, node) +# func get_pos(x, y): +# return grid[x * height + y].position +# onready var grid = radial_grid.new() + +#func debug_poly(poly): +# for k in range(poly.size()): +# var p1 = poly[k] +# var p2 = poly[(k + 1) % poly.size()] +# var l = p1.distance_to(p2) +# var d = (p2 - p1).normalized() +# var pt = p1 +# while l > 0.0: +# for e in range(0, 30, 2): +# var mi = MeshInstance.new() +# mi.mesh = CubeMesh.new() +# get_tree().root.add_child(mi) +# mi.global_transform.origin = pt + Vector3(0, e, 0) +# pt += d * 5.0 +# l -= 5.0 +# +#func calc_border(poly, offt): +# var height = RoadsData.get_site_avg_height(0) +# var border = [] +# border.resize(poly.size()) +# for k in range(poly.size()): +# var i = k - 1 +# if i < 0: +# i += poly.size() +# var p1 = poly[i] +# var p2 = poly[k] +# var p3 = poly[(k + 1) % poly.size()] +# var p1x = Vector2(p1.x, p1.z) +# var p2x = Vector2(p2.x, p2.z) +# var p3x = Vector2(p2.x, p2.z) +# var p4x = Vector2(p3.x, p3.z) +# var n1 = (p2x - p1x).tangent().normalized() +# var n2 = (p4x - p3x).tangent().normalized() +# p1x -= n1 * offt +# p2x -= n1 * offt +# p3x -= n2 * offt +# p4x -= n2 * offt +# +# var xp = Geometry.segment_intersects_segment_2d(p1x, p2x, p3x, p4x) +# if !xp: +# xp = p2x.linear_interpolate(p3x, 0.5) - (n1 + n2).normalized() * offt +# var tp = Vector3(xp.x, height, xp.y) +# border[k] = tp +# return border +# +var traffic_rnd: RandomNumberGenerator +var traffic_astar: AStar var towns = 0 func setup_town(site): if !RoadsData.site_is_town(site): @@ -116,7 +157,7 @@ func setup_town(site): return var poly = RoadsData.get_site_polygon_3d(site) var height = RoadsData.get_site_avg_height(site) - var border2 = calc_border(poly, 60) + var border2 = RoadsData.get_site_border(site, 60) var aabbs = [] var poly2 = [] poly2.resize(border2.size()) @@ -127,8 +168,8 @@ func setup_town(site): center += p center /= poly.size() center.y = height - grid.build(border2, center) - var radial_points = grid.radial_points +# grid.build(border2, center) + var radial_points = RoadsData.get_site_radial_points(site, 32.0, 64.0) var max_r = 0.0 for p in range(radial_points.size()): var ep = radial_points[p] @@ -156,7 +197,7 @@ func setup_town(site): var xform = Transform(Basis(), pstart).looking_at(pstart + d, Vector3.UP) stream_obj("trailer_house", xform) var aabb = AABB(pstart, Vector3()) - aabb = aabb.grow(20) + aabb = aabb.grow(32) aabbs.push_back(aabb) print("placed to: ", pstart) pstart = pstart + d * step @@ -167,9 +208,9 @@ func setup_first_town(): assert(!done) var poly = RoadsData.get_site_polygon_3d(0) var height = RoadsData.get_site_avg_height(0) - var border = calc_border(poly, 32) - var border1a = calc_border(poly, 42) - var border2 = calc_border(poly, 60) + var border = RoadsData.get_site_border(0, 32) + var border1a = RoadsData.get_site_border(0, 42) + var border2 = RoadsData.get_site_border(0, 60) var poly2 = [] poly2.resize(border2.size()) @@ -180,8 +221,8 @@ func setup_first_town(): center += p center /= poly.size() center.y = height - grid.build(border2, center) - var radial_points = grid.radial_points +# grid.build(border2, center) + var radial_points = RoadsData.get_site_radial_points(0, 32.0, 64.0) var max_r = 0.0 for p in range(radial_points.size()): var ep = radial_points[p] @@ -227,7 +268,7 @@ func setup_first_town(): var xform = Transform(Basis(), pstart).looking_at(pstart + d, Vector3.UP) stream_obj("trailer_house", xform) var aabb = AABB(pstart, Vector3()) - aabb = aabb.grow(20) + aabb = aabb.grow(32) aabbs.push_back(aabb) print("placed to: ", pstart) pstart = pstart + d * step @@ -235,9 +276,64 @@ func setup_first_town(): towns += 1 done = true +func setup_traffic(site): + var poly = RoadsData.get_site_polygon_3d(site) + var lp = get_tree().root + for p in range(poly.size()): + var p1 = poly[p] + var p2 = poly[(p + 1) % poly.size()] + var n = (p2 - p1).cross(Vector3.UP).normalized() + var t = (p2 - p1).normalized() + var l = p1.distance_to(p2) + var xpos = p1 + t * 8.0 + var xe = 128.0 + if l < xe + 16.0: + xpos = p1.linear_interpolate(p2, 0.5) + var x = xpos + n * 1.5 + Vector3.UP * 0.5 + var xform = Transform(Basis(), x).looking_at(x + t * 3.0, Vector3.UP) + var c = Spatial.new() + lp.add_child(c) + c.transform = xform + c.add_to_group("spawn") + c.add_to_group("keep") + c.add_to_group("traffic_spawn") + else: + while l > xe + 16.0: + var x = xpos + n * 4.0 + Vector3.UP * 0.5 + var xform = Transform(Basis(), x).looking_at(x + t * 3.0, Vector3.UP) + var c = Spatial.new() + lp.add_child(c) + c.transform = xform + c.add_to_group("spawn") + c.add_to_group("keep") + c.add_to_group("traffic_spawn") + xpos += t * xe + l -= xe + func _ready(): + traffic_rnd = RandomNumberGenerator.new() + traffic_rnd.randomize() + traffic_astar = AStar.new() for k in obj_names.keys(): Spawner.add_scene(k, obj_names[k]) + for k in palace_map_data.keys(): + Spawner.add_scene(k, palace_map_data[k]) + 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]) + Traffic.add_traffic_vehicle(car) # Called every frame. 'delta' is the elapsed time since the previous frame. var delay = 3.0 @@ -249,7 +345,7 @@ func _process(delta): if delay < 0: state = 1 1: - Spawner.update_view(self, 300) + Spawner.update_view(self, 200) var sc = get_tree().root var viewport: = get_viewport() if !viewport: @@ -258,15 +354,143 @@ func _process(delta): if !cam: return var cam_xform: = cam.global_transform + # building parts + call_deferred("real_spawn_child") func stream_obj(obj: String, xform: Transform): Spawner.place_scene(obj, xform) +func switch_to_distant_vehicle(n): + var sp = PhysicsServer.body_get_space(n.get_rid()) + var l = n.get_linear_velocity() + n.set_meta("velocity", l) + n.set_meta("space", sp) + PhysicsServer.body_set_space(n.get_rid(), RID()) +func switch_to_close_vehicle(n): + var sp = n.get_meta("space") + PhysicsServer.body_set_space(n.get_rid(), sp) + n.remove_meta("space") + if n.has_meta("velocity"): + n.set_linear_velocity(n.get_meta("velocity")) + n.remove_meta("velocity") func _physics_process(delta): var cam = get_viewport().get_camera() if !cam: 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 + var check_coords = cam.global_transform.xform_inv(p2) + var steer = 0.0 + var x_target = Vector3() + var next_target = Vector3() + 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"): + create_path(n, p2, direction * 10.0) + if n.has_meta("curve"): + var curve = n.get_meta("curve") + if curve.get_point_count() > 0: + var plength = n.get_meta("curve_length") + var offt = curve.get_closest_offset(p2) + var offt_ext = 8.0 + if n.has_meta("velocity"): + offt_ext = n.get_meta("velocity").length() + offt = clamp(offt + offt_ext, 0, plength) + var p0 = curve.interpolate_baked(offt, false) + next_target = p0 + if false: # p0.distance_squared_to(p2) > 16.0: + n.remove_meta("curve") + steer = 0.0 + x_target = Vector3() + next_target = p2 + direction * 4.0 + else: + var xt0 = n.global_transform.xform_inv(p0) + x_target = xt0 + if xt0.z < 0.0: + steer = xt0.x + if steer == 0.0: + steer = -1 + else: + steer = x_target.x + steer = sign(steer) +# if abs(steer) < 0.005: +# steer = 0.0 + n.set_meta("x_target", x_target) + print("position: ", p2, " direction: ", direction, " next_target: ", next_target, " x_target: ", x_target, " steer: ", steer, " ! ", (next_target - p2).normalized()) + else: + assert(false) +# if check_coords.z > 160 || check_coords.z < -120 || abs(check_coords.x) > 100: +# n.queue_free() + if false: # check_coords.z > 40.0 || check_coords.z < -25.0 || abs(check_coords.x) > 20.0: + if !n.has_meta("space"): + switch_to_distant_vehicle(n) + var xvel = (next_target - p2).normalized() * 6.0 + n.set_meta("velocity", xvel) + var pos = n.global_transform.origin + var vel = (next_target - p2).normalized() * 6.0 + if n.has_meta("velocity"): + vel = n.get_meta("velocity") + var speed = vel.length() + + var stf = (next_target - pos).normalized() * speed +# stf.y = vel.y + vel = vel.linear_interpolate(stf, delta) + var target_pos = pos + vel +# vel.y = vel.y * delta + var newpos = pos.linear_interpolate(target_pos, delta) + n.set_meta("velocity", vel) + # why? + var xform = Transform(Basis(), newpos).looking_at(newpos - vel * 4.0, Vector3.UP) + n.global_transform = xform + else: + if n.has_meta("space"): + switch_to_close_vehicle(n) + var v = n.get_linear_velocity() + n.set_meta("velocity", v) + var l = v.length() +# if abs(steer) > 3.0 || !good_path: +# # vehicle totally lost +# n.brake = 60000 +# n.engine_force = 0 +# elif abs(steer) > 2.0: +# # vehicle lost +# n.engine_force = 0 + if next_target.length_squared() == 0: + engine_force = 0.0 + steer = 0.0 + else: + 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 = 0.0 + engine_force = clamp(engine_force, 0, 8500) + print("engine_force: ", engine_force) + n.engine_force = engine_force + n.brake = 0 +# n.steering = clamp(steer, -1, 1) + 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"): @@ -289,8 +513,114 @@ func _physics_process(delta): elif n.is_in_group("female"): characters.replace_character(n, "female", ["cmdq", "marker", "hurtboxes", "student"]) elif n.is_in_group("car"): - var c = car.instance() - var p = get_tree().root - p.add_child(c) - c.global_transform = n.global_transform - n.queue_free() + var p1 = cam.global_transform.origin + var p2 = n.global_transform.origin + if p1.distance_squared_to(p2) < 5000.0: + var c = car.instance() + c.add_to_group("saved_vehicle") + var p = get_tree().root + p.add_child(c) + c.global_transform = n.global_transform + n.queue_free() +# elif n.is_in_group("traffic_spawn"): +# var p1 = cam.global_transform.origin +# var p2 = n.global_transform.origin +# if !n.has_meta("cooldown") && p1.distance_squared_to(p2) < 10000.0: +# var c = car.instance() +# c.add_to_group("traffic_vehicle") +# var p = get_tree().root +# p.add_child(c) +# c.global_transform = n.global_transform +# c.parked = false +# c.mode = c.MODE_RIGID +# c.engine_force = 2500 +# c.steering = 0 +# var xf = c.global_transform +# xf.origin = Vector3() +# var vel = xf.xform(Vector3(0, 0, -10)) +# c.set_linear_velocity(vel) +# var sp = PhysicsServer.body_get_space(c.get_rid()) +# c.set_meta("space", sp) +# PhysicsServer.body_set_space(c.get_rid(), RID()) +# n.set_meta("cooldown", 2.0 + randi() % 8) +# # create_path(c, p2, vel) +# elif n.has_meta("cooldown"): +# var cd = n.get_meta("cooldown") +# cd -= delta +# if cd < 0: +# n.remove_meta("cooldown") +func get_curve_closest(curve, p2): + var test_offt = curve.get_closest_offset(p2) + var testp = curve.interpolate_baked(test_offt, false) + return testp +func test_curve(curve, p2): + var testp = get_curve_closest(curve, p2) + return testp.distance_squared_to(p2) < 16.0 + +func create_path(c, p2, vel): + c.set_meta("velocity", vel) + print("create_path: velocity: ", vel) + var rangle = traffic_rnd.randf() * PI * 2.0 + var randa = 500.0 + traffic_rnd.randf() * 500.0 + var xt = cos(rangle) * randa + var yt = cos(rangle) * randa + var rv = Vector3(xt, 0, yt) + var target = RoadsData.get_closest_point(p2 + rv, false) + var cur = RoadsData.get_closest_point(p2, false) + while cur == target: + rangle = traffic_rnd.randf() * PI * 2.0 + randa = 500.0 + traffic_rnd.randf() * 500.0 + xt = cos(rangle) * randa + yt = sin(rangle) * randa + rv = Vector3(xt, 0, yt) + target = RoadsData.get_closest_point(p2 + rv, false) + c.set_meta("target", target) + var path = RoadsData.get_point_path(cur, target); + assert(cur != target) + assert(path.size() > 0) + var curve = Curve3D.new() + for e in range(path.size() - 1): + var pt1 = path[e] + var pt2 = path[e + 1] + var nt = (pt2 - pt1).cross(Vector3.UP).normalized() + var d = (pt2 - pt1).normalized() + var l = pt1.distance_to(pt2) + while l > 16.0: + pt1 += d * 8.0 + curve.add_point(pt1 + nt * 3.0 + Vector3.UP * 0.5) + l -= 8.0 + if (!test_curve(curve, p2)): + var testp = get_curve_closest(curve, p2) + var e = p2 + (testp - p2).normalized() * 2.0 + var nt = (testp - p2).cross(Vector3.UP).normalized() + curve.add_point(e + nt * 3.0 + Vector3.UP * 0.5, Vector3(), Vector3(), 0) + assert(test_curve(curve, p2)) + c.set_meta("curve", curve) + c.set_meta("curve_length", curve.get_baked_length()) + +# buildings + +var spawn = [] + +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 + +func update_node_position(n): + var space_state = get_viewport().get_world().direct_space_state + var where = n.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: + n.global_transform.origin = result.position diff --git a/objects/palace.bin b/objects/palace.bin index c653aff..bdac69e 100644 Binary files a/objects/palace.bin and b/objects/palace.bin differ diff --git a/objects/palace.gd b/objects/palace.gd index 972bab0..a29ae04 100644 --- a/objects/palace.gd +++ b/objects/palace.gd @@ -1,22 +1,9 @@ extends Spatial -var courtyard_tile: PackedScene = load("res://objects/courtyard-tile.scn") -var foundation_tile: PackedScene = load("res://objects/foundation.scn") -var room_tile: PackedScene = load("res://objects/block-room-corridoor.scn") -var tower_walls_tile: PackedScene = load("res://objects/tower-walls.scn") -var tower_floor_tile: PackedScene = load("res://objects/tower_floor.scn") -var stairs_tile: PackedScene = load("res://objects/stairs.scn") -var gate_bottom_tile: PackedScene = load("res://objects/gate_bottom.scn") -var gate_top_tile: PackedScene = load("res://objects/gate-top.scn") -var entry_tile: PackedScene = load("res://objects/block-room-entry.scn") -var roof_tile: PackedScene = load("res://objects/roof.scn") -var tower_roof_tile: PackedScene = load("res://objects/tower-roof.scn") - const tile_size = 8 const palace_size = 8 const layers = 4 - func _ready(): var voffset = 0.0 for layer in range(layers): @@ -34,15 +21,16 @@ func _ready(): var x = i * tile_size - palace_size * tile_size / 2 var z = j * tile_size - palace_size * tile_size / 2 if layer == 0: - var ct = courtyard_tile.instance() + var ct = "courtyard_tile" var xform = Transform(Basis(), Vector3(x, voffset, z)) if i > 0 && i < palace_size - 1: if j > 0 && j < palace_size - 1: call_deferred("place", ct, xform) if i in [0, palace_size - 1] || j in [0, palace_size - 1]: - call_deferred("place", ct, xform) + if (j == palace_size / 2.0 || i != palace_size / 2.0): + call_deferred("place", "foundation_tile", xform) else: - var ct = room_tile.instance() + var ct = "room_tile" var tower_angles = { 0: { @@ -71,15 +59,15 @@ func _ready(): elif tower_angles.has(i) && tower_angles[i].has(j): xform.basis = Basis().rotated(Vector3.UP, tower_angles[i][j]) if layer == layers - 1: - var twr = tower_roof_tile.instance() + var twr = "tower_roof_tile" call_deferred("place", twr, xform) else: - var tw = tower_walls_tile.instance() + var tw = "tower_walls_tile" call_deferred("place", tw, xform) - var st = stairs_tile.instance() + var st = "stairs_tile" call_deferred("place", st, xform) if layer == 1: - var tfl = tower_floor_tile.instance() + var tfl = "tower_floor_tile" call_deferred("place", tfl, xform) var car = Spatial.new() car.add_to_group("spawn") @@ -97,27 +85,26 @@ func _ready(): add_child(major_f) major_f.global_transform = Transform(Basis(), Vector3(cos(PI / 3 * e) * 2.0, 0, sin(PI / 3 * e) * 2.0) + Vector3(10.0, 0, 0)) print("PALACE done") -func place(obj, where): - add_child(obj) - obj.transform = where - print("placed at ", where.origin) + +func place(obj: String, where: Transform): + streaming.spawn_child(obj, global_transform * where) func spawn_wall(layer:int, i: int, j: int, xform: Transform): if layer == layers - 1: - var rt = roof_tile.instance() + var rt = "roof_tile" call_deferred("place", rt, xform) elif (j != palace_size / 2.0 && i != palace_size / 2.0)|| layer > 2: - var ct = room_tile.instance() + var ct = "room_tile" call_deferred("place", ct, xform) elif (j == palace_size / 2.0 && i != palace_size / 2.0) && layer == 1: - var ent = entry_tile.instance() + var ent = "entry_tile" call_deferred("place", ent, xform) elif (j != palace_size / 2.0 && i == palace_size / 2.0) && layer == 1: - var gw = gate_bottom_tile.instance() + var gw = "gate_bottom_tile" call_deferred("place", gw, xform) elif (j != palace_size / 2.0 && i == palace_size / 2.0) && layer == 2: - var gw = gate_top_tile.instance() + var gw = "gate_top_tile" call_deferred("place", gw, xform) elif (j == palace_size / 2.0 && i != palace_size / 2.0) && layer == 2: - var ct = room_tile.instance() + var ct = "room_tile" call_deferred("place", ct, xform) diff --git a/objects/palace.gltf b/objects/palace.gltf index 8068194..2bad6d4 100644 --- a/objects/palace.gltf +++ b/objects/palace.gltf @@ -1,6 +1,6 @@ { "asset" : { - "generator" : "Khronos glTF Blender I/O v1.6.16", + "generator" : "Khronos glTF Blender I/O v1.5.17", "version" : "2.0" }, "scene" : 0, @@ -176,7 +176,7 @@ "NORMAL" : 9, "TEXCOORD_0" : 10 }, - "indices" : 3, + "indices" : 11, "material" : 0 } ] @@ -186,11 +186,11 @@ "primitives" : [ { "attributes" : { - "POSITION" : 11, - "NORMAL" : 12, - "TEXCOORD_0" : 13 + "POSITION" : 12, + "NORMAL" : 13, + "TEXCOORD_0" : 14 }, - "indices" : 14, + "indices" : 15, "material" : 0 } ] @@ -200,11 +200,11 @@ "primitives" : [ { "attributes" : { - "POSITION" : 15, - "NORMAL" : 16, - "TEXCOORD_0" : 17 + "POSITION" : 16, + "NORMAL" : 17, + "TEXCOORD_0" : 18 }, - "indices" : 18, + "indices" : 19, "material" : 0 } ] @@ -214,11 +214,11 @@ "primitives" : [ { "attributes" : { - "POSITION" : 19, - "NORMAL" : 20, - "TEXCOORD_0" : 21 + "POSITION" : 20, + "NORMAL" : 21, + "TEXCOORD_0" : 22 }, - "indices" : 22, + "indices" : 23, "material" : 0 } ] @@ -228,11 +228,11 @@ "primitives" : [ { "attributes" : { - "POSITION" : 23, - "NORMAL" : 24, - "TEXCOORD_0" : 25 + "POSITION" : 24, + "NORMAL" : 25, + "TEXCOORD_0" : 26 }, - "indices" : 26, + "indices" : 27, "material" : 0 } ] @@ -242,11 +242,11 @@ "primitives" : [ { "attributes" : { - "POSITION" : 27, - "NORMAL" : 28, - "TEXCOORD_0" : 29 + "POSITION" : 28, + "NORMAL" : 29, + "TEXCOORD_0" : 30 }, - "indices" : 30, + "indices" : 31, "material" : 0 } ] @@ -256,11 +256,11 @@ "primitives" : [ { "attributes" : { - "POSITION" : 31, - "NORMAL" : 32, - "TEXCOORD_0" : 33 + "POSITION" : 32, + "NORMAL" : 33, + "TEXCOORD_0" : 34 }, - "indices" : 34, + "indices" : 35, "material" : 0 } ] @@ -270,11 +270,11 @@ "primitives" : [ { "attributes" : { - "POSITION" : 35, - "NORMAL" : 36, - "TEXCOORD_0" : 37 + "POSITION" : 36, + "NORMAL" : 37, + "TEXCOORD_0" : 38 }, - "indices" : 38, + "indices" : 39, "material" : 0 } ] @@ -284,11 +284,11 @@ "primitives" : [ { "attributes" : { - "POSITION" : 39, - "NORMAL" : 40, - "TEXCOORD_0" : 41 + "POSITION" : 40, + "NORMAL" : 41, + "TEXCOORD_0" : 42 }, - "indices" : 42 + "indices" : 43 } ] } @@ -365,7 +365,7 @@ { "bufferView" : 8, "componentType" : 5126, - "count" : 24, + "count" : 20, "max" : [ 4, 0.800000011920929, @@ -381,17 +381,23 @@ { "bufferView" : 9, "componentType" : 5126, - "count" : 24, + "count" : 20, "type" : "VEC3" }, { "bufferView" : 10, "componentType" : 5126, - "count" : 24, + "count" : 20, "type" : "VEC2" }, { "bufferView" : 11, + "componentType" : 5123, + "count" : 30, + "type" : "SCALAR" + }, + { + "bufferView" : 12, "componentType" : 5126, "count" : 849, "max" : [ @@ -407,25 +413,25 @@ "type" : "VEC3" }, { - "bufferView" : 12, + "bufferView" : 13, "componentType" : 5126, "count" : 849, "type" : "VEC3" }, { - "bufferView" : 13, + "bufferView" : 14, "componentType" : 5126, "count" : 849, "type" : "VEC2" }, { - "bufferView" : 14, + "bufferView" : 15, "componentType" : 5123, "count" : 2178, "type" : "SCALAR" }, { - "bufferView" : 15, + "bufferView" : 16, "componentType" : 5126, "count" : 905, "max" : [ @@ -441,27 +447,27 @@ "type" : "VEC3" }, { - "bufferView" : 16, + "bufferView" : 17, "componentType" : 5126, "count" : 905, "type" : "VEC3" }, { - "bufferView" : 17, + "bufferView" : 18, "componentType" : 5126, "count" : 905, "type" : "VEC2" }, { - "bufferView" : 18, + "bufferView" : 19, "componentType" : 5123, "count" : 1596, "type" : "SCALAR" }, { - "bufferView" : 19, + "bufferView" : 20, "componentType" : 5126, - "count" : 80, + "count" : 104, "max" : [ 4, 3.799999952316284, @@ -469,31 +475,31 @@ ], "min" : [ -4, - -0.19999992847442627, + -0.9999999403953552, -4.5 ], "type" : "VEC3" }, { - "bufferView" : 20, + "bufferView" : 21, "componentType" : 5126, - "count" : 80, + "count" : 104, "type" : "VEC3" }, { - "bufferView" : 21, + "bufferView" : 22, "componentType" : 5126, - "count" : 80, + "count" : 104, "type" : "VEC2" }, { - "bufferView" : 22, + "bufferView" : 23, "componentType" : 5123, - "count" : 156, + "count" : 252, "type" : "SCALAR" }, { - "bufferView" : 23, + "bufferView" : 24, "componentType" : 5126, "count" : 504, "max" : [ @@ -509,25 +515,25 @@ "type" : "VEC3" }, { - "bufferView" : 24, + "bufferView" : 25, "componentType" : 5126, "count" : 504, "type" : "VEC3" }, { - "bufferView" : 25, + "bufferView" : 26, "componentType" : 5126, "count" : 504, "type" : "VEC2" }, { - "bufferView" : 26, + "bufferView" : 27, "componentType" : 5123, "count" : 1332, "type" : "SCALAR" }, { - "bufferView" : 27, + "bufferView" : 28, "componentType" : 5126, "count" : 4, "max" : [ @@ -543,25 +549,25 @@ "type" : "VEC3" }, { - "bufferView" : 28, + "bufferView" : 29, "componentType" : 5126, "count" : 4, "type" : "VEC3" }, { - "bufferView" : 29, + "bufferView" : 30, "componentType" : 5126, "count" : 4, "type" : "VEC2" }, { - "bufferView" : 30, + "bufferView" : 31, "componentType" : 5123, "count" : 6, "type" : "SCALAR" }, { - "bufferView" : 31, + "bufferView" : 32, "componentType" : 5126, "count" : 1143, "max" : [ @@ -577,25 +583,25 @@ "type" : "VEC3" }, { - "bufferView" : 32, + "bufferView" : 33, "componentType" : 5126, "count" : 1143, "type" : "VEC3" }, { - "bufferView" : 33, + "bufferView" : 34, "componentType" : 5126, "count" : 1143, "type" : "VEC2" }, { - "bufferView" : 34, + "bufferView" : 35, "componentType" : 5123, "count" : 3180, "type" : "SCALAR" }, { - "bufferView" : 35, + "bufferView" : 36, "componentType" : 5126, "count" : 36, "max" : [ @@ -611,25 +617,25 @@ "type" : "VEC3" }, { - "bufferView" : 36, + "bufferView" : 37, "componentType" : 5126, "count" : 36, "type" : "VEC3" }, { - "bufferView" : 37, + "bufferView" : 38, "componentType" : 5126, "count" : 36, "type" : "VEC2" }, { - "bufferView" : 38, + "bufferView" : 39, "componentType" : 5123, "count" : 60, "type" : "SCALAR" }, { - "bufferView" : 39, + "bufferView" : 40, "componentType" : 5126, "count" : 1832, "max" : [ @@ -645,19 +651,19 @@ "type" : "VEC3" }, { - "bufferView" : 40, + "bufferView" : 41, "componentType" : 5126, "count" : 1832, "type" : "VEC3" }, { - "bufferView" : 41, + "bufferView" : 42, "componentType" : 5126, "count" : 1832, "type" : "VEC2" }, { - "bufferView" : 42, + "bufferView" : 43, "componentType" : 5123, "count" : 2964, "type" : "SCALAR" @@ -706,183 +712,188 @@ }, { "buffer" : 0, - "byteLength" : 288, + "byteLength" : 240, "byteOffset" : 39872 }, { "buffer" : 0, - "byteLength" : 288, - "byteOffset" : 40160 + "byteLength" : 240, + "byteOffset" : 40112 }, { "buffer" : 0, - "byteLength" : 192, - "byteOffset" : 40448 + "byteLength" : 160, + "byteOffset" : 40352 + }, + { + "buffer" : 0, + "byteLength" : 60, + "byteOffset" : 40512 }, { "buffer" : 0, "byteLength" : 10188, - "byteOffset" : 40640 + "byteOffset" : 40572 }, { "buffer" : 0, "byteLength" : 10188, - "byteOffset" : 50828 + "byteOffset" : 50760 }, { "buffer" : 0, "byteLength" : 6792, - "byteOffset" : 61016 + "byteOffset" : 60948 }, { "buffer" : 0, "byteLength" : 4356, - "byteOffset" : 67808 + "byteOffset" : 67740 }, { "buffer" : 0, "byteLength" : 10860, - "byteOffset" : 72164 + "byteOffset" : 72096 }, { "buffer" : 0, "byteLength" : 10860, - "byteOffset" : 83024 + "byteOffset" : 82956 }, { "buffer" : 0, "byteLength" : 7240, - "byteOffset" : 93884 + "byteOffset" : 93816 }, { "buffer" : 0, "byteLength" : 3192, - "byteOffset" : 101124 + "byteOffset" : 101056 }, { "buffer" : 0, - "byteLength" : 960, - "byteOffset" : 104316 + "byteLength" : 1248, + "byteOffset" : 104248 }, { "buffer" : 0, - "byteLength" : 960, - "byteOffset" : 105276 + "byteLength" : 1248, + "byteOffset" : 105496 }, { "buffer" : 0, - "byteLength" : 640, - "byteOffset" : 106236 + "byteLength" : 832, + "byteOffset" : 106744 }, { "buffer" : 0, - "byteLength" : 312, - "byteOffset" : 106876 + "byteLength" : 504, + "byteOffset" : 107576 }, { "buffer" : 0, "byteLength" : 6048, - "byteOffset" : 107188 + "byteOffset" : 108080 }, { "buffer" : 0, "byteLength" : 6048, - "byteOffset" : 113236 + "byteOffset" : 114128 }, { "buffer" : 0, "byteLength" : 4032, - "byteOffset" : 119284 + "byteOffset" : 120176 }, { "buffer" : 0, "byteLength" : 2664, - "byteOffset" : 123316 + "byteOffset" : 124208 }, { "buffer" : 0, "byteLength" : 48, - "byteOffset" : 125980 + "byteOffset" : 126872 }, { "buffer" : 0, "byteLength" : 48, - "byteOffset" : 126028 + "byteOffset" : 126920 }, { "buffer" : 0, "byteLength" : 32, - "byteOffset" : 126076 + "byteOffset" : 126968 }, { "buffer" : 0, "byteLength" : 12, - "byteOffset" : 126108 + "byteOffset" : 127000 }, { "buffer" : 0, "byteLength" : 13716, - "byteOffset" : 126120 + "byteOffset" : 127012 }, { "buffer" : 0, "byteLength" : 13716, - "byteOffset" : 139836 + "byteOffset" : 140728 }, { "buffer" : 0, "byteLength" : 9144, - "byteOffset" : 153552 + "byteOffset" : 154444 }, { "buffer" : 0, "byteLength" : 6360, - "byteOffset" : 162696 + "byteOffset" : 163588 }, { "buffer" : 0, "byteLength" : 432, - "byteOffset" : 169056 + "byteOffset" : 169948 }, { "buffer" : 0, "byteLength" : 432, - "byteOffset" : 169488 + "byteOffset" : 170380 }, { "buffer" : 0, "byteLength" : 288, - "byteOffset" : 169920 + "byteOffset" : 170812 }, { "buffer" : 0, "byteLength" : 120, - "byteOffset" : 170208 + "byteOffset" : 171100 }, { "buffer" : 0, "byteLength" : 21984, - "byteOffset" : 170328 + "byteOffset" : 171220 }, { "buffer" : 0, "byteLength" : 21984, - "byteOffset" : 192312 + "byteOffset" : 193204 }, { "buffer" : 0, "byteLength" : 14656, - "byteOffset" : 214296 + "byteOffset" : 215188 }, { "buffer" : 0, "byteLength" : 5928, - "byteOffset" : 228952 + "byteOffset" : 229844 } ], "buffers" : [ { - "byteLength" : 234880, + "byteLength" : 235772, "uri" : "palace.bin" } ] diff --git a/objects/palace.material b/objects/palace.material index 846a8a3..acbd649 100644 Binary files a/objects/palace.material and b/objects/palace.material differ diff --git a/objects/trailer-house.gd b/objects/trailer-house.gd index 70051e0..37de624 100644 --- a/objects/trailer-house.gd +++ b/objects/trailer-house.gd @@ -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) diff --git a/scenes/vehicles/car.gd b/scenes/vehicles/car.gd index d40b32b..0faa950 100644 --- a/scenes/vehicles/car.gd +++ b/scenes/vehicles/car.gd @@ -215,9 +215,10 @@ func get_player_out_of_vehicle(data): #var d = 1.0 #var state = 0 func _process(delta): - if parked: - mode = RigidBody.MODE_KINEMATIC - return + pass +# if parked: +# mode = RigidBody.MODE_KINEMATIC +# return # if engine_force > 1000.0 && linear_velocity.length() < 0.1: # apply_central_impulse(global_transform.basis.y * mass * 1 + global_transform.basis.z * mass * 5) # if d > 0: @@ -245,9 +246,9 @@ func is_upright(): if v.y > v.x && v.y > v.z: return true return false -func _physics_process(delta): - if is_upright(): - if abs(engine_force) > 0 && linear_velocity.y * delta > 0.05: - add_central_force(Vector3(0, -linear_velocity.y * delta * mass, 0)) - var l = linear_velocity.length() * delta - add_central_force(Vector3(0, -l * 0.5 * mass, 0)) +#func _physics_process(delta): +# if is_upright(): +# if abs(engine_force) > 0 && linear_velocity.y * delta > 0.05: +# add_central_force(Vector3(0, -linear_velocity.y * delta * mass, 0)) +# var l = linear_velocity.length() * delta +# add_central_force(Vector3(0, -l * 0.5 * mass, 0)) diff --git a/world.gd b/world.gd index 5724bfe..f5d0745 100644 --- a/world.gd +++ b/world.gd @@ -58,8 +58,7 @@ func _process(delta): $player.global_transform.origin.z = v.y else: streaming.setup_town(site) - if streaming.towns > 30: - break + streaming.setup_traffic(site) print("towns done: ", streaming.towns) player = characters.replace_character($player, "male", ["player", "cmdq", "player_clothes"]) player.add_child(VoxelViewer.new()) diff --git a/world.tscn b/world.tscn index 7e254b6..652bb31 100644 --- a/world.tscn +++ b/world.tscn @@ -63,6 +63,7 @@ run_stream_in_editor = false [node name="DirectionalLight" type="DirectionalLight" parent="."] transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 100, 0 ) +shadow_enabled = true [node name="Camera" type="Camera" parent="."] transform = Transform( 0.819152, 0.40558, -0.40558, 0, 0.707107, 0.707107, 0.573577, -0.579228, 0.579228, 0, 150, 0 )