update
This commit is contained in:
@@ -89,7 +89,9 @@ func _bebauung() -> void:
|
||||
0.10 + rng.randf() * 0.14, 0.62 + rng.randf() * 0.26)
|
||||
var bau := Node3D.new()
|
||||
add_child(bau)
|
||||
Prims.box(bau, c + Vector3(0, hoehe * 0.5, 0), Vector3(g.x, hoehe, g.y), ton)
|
||||
var klotz := Prims.box(bau, c + Vector3(0, hoehe * 0.5, 0), Vector3(g.x, hoehe, g.y), ton, false)
|
||||
# Kollision etwas größer: so schließt sich die Fuge zum Nachbarn, niemand keilt sich hinein
|
||||
Prims._add_box_body(klotz, Vector3(g.x + 0.9, hoehe, g.y + 0.9))
|
||||
for f in range(n):
|
||||
_fenster(bau, c + Vector3(0, Orte.hoehe(f), 0), g, ton)
|
||||
Prims.box(bau, c + Vector3(0, hoehe + 0.2, 0),
|
||||
@@ -188,51 +190,86 @@ func _decke(parent: Node, key: String, cf: Vector3, _groesse: Vector3, farbe: Co
|
||||
Prims.box(parent, mitte, Vector3(mass.x, 0.2, mass.y), farbe)
|
||||
|
||||
|
||||
## Ein paar Möbel, damit man sieht, wofür ein Raum da ist. Nichts steht im
|
||||
## Treppenstreifen.
|
||||
## Ein paar Möbel, damit man sieht, wofür ein Raum da ist. Gestellt wird im
|
||||
## Rahmen der Tür (quer / zur Tür hin); was in der Türzone, im Treppenstreifen
|
||||
## oder auf dem Weg von der Tür zur Treppe stünde, bleibt weg.
|
||||
func _einrichtung(parent: Node, c: Vector3, groesse: Vector3, farbe: Color, key: String,
|
||||
ort: String = "") -> void:
|
||||
if ort == "":
|
||||
ort = key
|
||||
var w := maxf(0.5, groesse.x * 0.5 - 2.0)
|
||||
var h := maxf(0.5, groesse.z * 0.5 - 2.0)
|
||||
var frei := func(v: Vector3, halb: float) -> Vector3:
|
||||
var p := Orte.frei_von_treppe(HumanDB.PLACES, ort, c + v, halb)
|
||||
p.y = c.y + v.y
|
||||
return p
|
||||
var d: Vector3 = Orte.DIR_VEC[HumanDB.PLACES[ort]["dir"]]
|
||||
var hd: float = (groesse.z if absf(d.z) > 0.0 else groesse.x) * 0.5
|
||||
var hq: float = (groesse.x if absf(d.z) > 0.0 else groesse.z) * 0.5
|
||||
var w := maxf(0.5, hq - 2.0)
|
||||
var h := maxf(0.5, hd - 2.0)
|
||||
if key.begins_with("heim_"):
|
||||
Prims.box(parent, frei.call(Vector3(-w * 0.6, 0.35, -h * 0.5), 1.5), Vector3(1.9, 0.7, 3.0),
|
||||
# an der Türwand, links und rechts der Tür -- die Rückwand gehört der Treppe
|
||||
_moebel(parent, ort, c, hq - 1.35, hd - 1.6, 0.35, Vector3(1.9, 0.7, 2.4),
|
||||
Color(0.85, 0.85, 0.90))
|
||||
Prims.box(parent, frei.call(Vector3(w * 0.6, 0.75, 0), 1.1), Vector3(1.5, 0.15, 2.2),
|
||||
farbe.darkened(0.5))
|
||||
Prims.box(parent, frei.call(Vector3(w * 0.6, 1.05, 0), 0.1), Vector3(0.8, 0.55, 0.1),
|
||||
Color(0.2, 0.25, 0.3))
|
||||
if _moebel(parent, ort, c, -(hq - 1.15), hd - 1.6, 0.75, Vector3(1.5, 0.15, 2.2),
|
||||
farbe.darkened(0.5)):
|
||||
_moebel(parent, ort, c, -(hq - 1.15), hd - 1.6, 1.05, Vector3(0.8, 0.55, 0.1),
|
||||
Color(0.2, 0.25, 0.3))
|
||||
elif key == "cafe":
|
||||
for i in range(3):
|
||||
Prims.cyl(parent, frei.call(Vector3(-w * 0.5 + float(i) * w * 0.5, 0.4, 0.4), 0.7), 0.7, 0.8,
|
||||
Color(0.55, 0.40, 0.30))
|
||||
Prims.box(parent, frei.call(Vector3(0, 0.55, -h * 0.7), 0.4), Vector3(groesse.x - 3.0, 1.1, 0.8),
|
||||
_moebel(parent, ort, c, -w * 0.5 + float(i) * w * 0.5, 0.4, 0.4,
|
||||
Vector3(1.4, 0.8, 1.4), Color(0.55, 0.40, 0.30), true)
|
||||
_moebel(parent, ort, c, -hq * 0.5, -(h * 0.7), 0.55, Vector3(hq - 1.5, 1.1, 0.8),
|
||||
Color(0.45, 0.32, 0.24))
|
||||
elif key == "buero":
|
||||
for i in range(3):
|
||||
Prims.box(parent, frei.call(Vector3(-w * 0.5 + float(i) * w * 0.5, 0.75, 0), 0.8),
|
||||
_moebel(parent, ort, c, -w * 0.5 + float(i) * w * 0.5, h * 0.3, 0.75,
|
||||
Vector3(1.6, 0.15, 1.2), Color(0.75, 0.75, 0.78))
|
||||
elif key == "baeckerei":
|
||||
Prims.box(parent, frei.call(Vector3(0, 0.55, h * 0.5), 0.5), Vector3(groesse.x - 3.0, 1.1, 1.0),
|
||||
_moebel(parent, ort, c, -hq * 0.45, hd - 3.4, 0.55, Vector3(hq - 1.2, 1.1, 1.0),
|
||||
Color(0.70, 0.55, 0.35))
|
||||
Prims.box(parent, frei.call(Vector3(0, 0.85, -h * 0.6), 1.3), Vector3(2.6, 1.7, 1.2),
|
||||
_moebel(parent, ort, c, -(hq - 1.6), -(h * 0.6), 0.85, Vector3(2.6, 1.7, 1.2),
|
||||
Color(0.4, 0.4, 0.42))
|
||||
elif key == "uni":
|
||||
for i in range(3):
|
||||
Prims.box(parent, frei.call(Vector3(0, 0.5, -h * 0.6 + float(i) * h * 0.6), 0.35),
|
||||
Vector3(groesse.x - 3.0, 0.2, 0.7), Color(0.66, 0.62, 0.58))
|
||||
Prims.box(parent, frei.call(Vector3(0, 1.1, -h), 0.1), Vector3(groesse.x * 0.55, 1.6, 0.15),
|
||||
_moebel(parent, ort, c, -hq * 0.4, -h * 0.6 + float(i) * h * 0.6, 0.5,
|
||||
Vector3(hq - 1.5, 0.2, 0.7), Color(0.66, 0.62, 0.58))
|
||||
_moebel(parent, ort, c, -hq * 0.4, -h, 1.1, Vector3(hq * 0.8, 1.6, 0.15),
|
||||
Color(0.15, 0.25, 0.20))
|
||||
elif key == "werkstatt":
|
||||
Prims.box(parent, frei.call(Vector3(0, 0.6, 0), 0.7), Vector3(groesse.x - 4.0, 1.2, 1.4),
|
||||
_moebel(parent, ort, c, -hq * 0.4, 0.0, 0.6, Vector3(hq * 0.8 - 1.0, 1.2, 1.4),
|
||||
Color(0.52, 0.48, 0.46))
|
||||
|
||||
|
||||
## Ein Möbelstück: aq quer zur Tür, ad zur Tür hin (positiv = zur Tür), Maße
|
||||
## als (quer, hoch, tief). Steht es im Weg, wird es nicht gestellt.
|
||||
func _moebel(parent: Node, ort: String, c: Vector3, aq: float, ad: float, y: float,
|
||||
mass: Vector3, farbe: Color, rund: bool = false) -> bool:
|
||||
var d: Vector3 = Orte.DIR_VEC[HumanDB.PLACES[ort]["dir"]]
|
||||
var quer := Vector3(-d.z, 0, d.x)
|
||||
var pos := c + quer * aq + d * ad
|
||||
pos.y = c.y + y
|
||||
var s: Array = HumanDB.PLACES[ort]["size"]
|
||||
var hd: float = (float(s[1]) if absf(d.z) > 0.0 else float(s[0])) * 0.5
|
||||
var halb := maxf(mass.x, mass.z) * 0.5
|
||||
# Türzone: 2,2 tief hinter der Tür, 4 breit
|
||||
if ad + mass.z * 0.5 > hd - 2.2 and absf(aq) - mass.x * 0.5 < 2.0:
|
||||
return false
|
||||
# Treppenstreifen
|
||||
var r := Orte.treppen_rahmen(HumanDB.PLACES, ort)
|
||||
var n: Vector3 = r["n"]
|
||||
var tief_n: float = (mass.z if absf(n.dot(d)) > 0.5 else mass.x) * 0.5
|
||||
if (pos - c).dot(n) + tief_n > float(r["halb_n"]) - Orte.TREPPE_TIEFE - 0.3:
|
||||
return false
|
||||
# Weg von der Tür zur Treppe
|
||||
var von := Orte.innen_tuer(HumanDB.PLACES, ort)
|
||||
var bis := Orte.treppe(HumanDB.PLACES, ort, 0)
|
||||
var flach := Vector3(pos.x, 0, pos.z)
|
||||
if Geometry3D.get_closest_point_to_segment(flach, von, bis).distance_to(flach) < halb + 0.9:
|
||||
return false
|
||||
var welt_mass := mass if absf(d.z) > 0.0 else Vector3(mass.z, mass.y, mass.x)
|
||||
if rund:
|
||||
Prims.cyl(parent, pos, mass.x * 0.5, mass.y, farbe)
|
||||
else:
|
||||
Prims.box(parent, pos, welt_mass, farbe)
|
||||
return true
|
||||
|
||||
|
||||
## Der mittlere Block bleibt frei: Rasen, Teich, Bäume, Bänke. Der Park ist
|
||||
## der einzige Ort im Bezirk, an dem nicht gebaut wird.
|
||||
func _park() -> void:
|
||||
|
||||
Reference in New Issue
Block a user