Traffic implementation

This commit is contained in:
Segey Lapin
2021-11-01 14:27:27 +03:00
parent ba2444b592
commit daece19b55
9 changed files with 644 additions and 375 deletions

Binary file not shown.

View File

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

View File

@@ -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"
}
]

Binary file not shown.

View File

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