Files
Blockline/scripts/quarry_fabrication.gd

78 lines
4.0 KiB
GDScript

class_name QuarryFabrication
extends RefCounted
const STEEL := Color("4c5352")
const TRIM := Color("9b9d96")
static func rod(batch: UrbanMeshBatch, a: Vector3, b: Vector3, radius: float, tint: Color = STEEL) -> void:
batch.cylinder((a+b)*0.5, radius, a.distance_to(b), "metal", tint, Quaternion(Vector3.UP,(b-a).normalized()).get_euler())
static func build(arena: RelayArena) -> void:
if arena.map_id != "quarry" or DisplayServer.get_name() == "headless": return
var parent := Node3D.new()
parent.name = "QuarryFabrication"
arena.add_child(parent)
for origin in arena.building_origins:
var batch := UrbanMeshBatch.new()
# Roof drainage: open channel, rolled outer lip, brackets and a bent downpipe.
for side in [-1.0,1.0]:
var z: float = side * 5.76
batch.box(origin+Vector3(0,7.25,z),Vector3(9.25,0.04,0.24),"metal",STEEL)
batch.box(origin+Vector3(0,7.34,z+side*0.13),Vector3(9.25,0.2,0.025),"metal",TRIM)
rod(batch,origin+Vector3(-4.6,7.43,z+side*0.14),origin+Vector3(4.6,7.43,z+side*0.14),0.018,TRIM)
for x in [-4.0,-2.0,0.0,2.0,4.0]:
batch.box(origin+Vector3(x,7.2,z),Vector3(0.045,0.055,0.31),"metal",STEEL)
var x := 4.3
rod(batch,origin+Vector3(x,0.2,z),origin+Vector3(x,6.8,z),0.066,TRIM)
for index in 8:
var a := float(index)/8*PI/2
var b := float(index+1)/8*PI/2
rod(batch,origin+Vector3(x,6.8+sin(a)*0.4,z+side*(1-cos(a))*0.2),origin+Vector3(x,6.8+sin(b)*0.4,z+side*(1-cos(b))*0.2),0.066,TRIM)
for y in [0.8,2.6,4.5,6.3]:
batch.cylinder(origin+Vector3(x,y,z),0.081,0.05,"metal",STEEL)
batch.box(origin+Vector3(x,y,z-side*0.065),Vector3(0.22,0.08,0.08),"metal",STEEL)
# Fasteners and lap joints on solid piers, clear of the door opening.
for pier in [-3.05,3.05]:
for height in [0.35,2.75,3.2]:
for offset in [-0.65,0.65]:
batch.cylinder(origin+Vector3(pier+offset,height,side*5.735),0.028,0.018,"metal",TRIM,Vector3(PI/2,0,0))
# Mechanical roof grille with actual radial supports and fan blades.
for x in [0.45,1.55]:
var center := origin+Vector3(x,8.785,0.3)
for ring in [0.16,0.26,0.36,0.42]:
for segment in 32:
var a := float(segment)*TAU/32
var b := float(segment+1)*TAU/32
rod(batch,center+Vector3(cos(a)*ring,0,sin(a)*ring),center+Vector3(cos(b)*ring,0,sin(b)*ring),0.008)
for blade in 6:
var angle := blade*TAU/6
batch.box(center+Vector3(cos(angle)*0.19,-0.025,sin(angle)*0.19),Vector3(0.29,0.016,0.08),"metal",TRIM,Vector3(0,-angle,0.15))
batch.finish(parent,"Building_%s_%s" % [origin.x,origin.z])
vehicles(arena,parent)
static func vehicles(_arena: RelayArena, parent: Node3D) -> void:
var batch := UrbanMeshBatch.new()
for side in [-1,1]:
var truck := Vector3(side*13,0,side*56)
# Radiator slats, bumper, headlamp housings, steps, mirrors and body seams.
for row in 12:
batch.box(truck+Vector3(0,0.95+row*0.045,-3.968),Vector3(1.35,0.018,0.035),"metal",Color("242928"))
for edge in [-1,1]:
batch.bevel_box(truck+Vector3(edge*1.1,1.26,-3.98),Vector3(0.42,0.24,0.08),"glass",Color("cad4ce"),0.035)
rod(batch,truck+Vector3(edge*1.45,2.1,-3.35),truck+Vector3(edge*1.77,2.1,-3.35),0.025)
batch.bevel_box(truck+Vector3(edge*1.77,2.18,-3.35),Vector3(0.08,0.36,0.23),"rubber",Color("252827"),0.025)
batch.box(truck+Vector3(edge*1.5,0.82,-2.8),Vector3(0.16,0.08,0.75),"metal",STEEL)
for seam in [-1.5,-0.5,0.5,1.5,2.5,3.5]:
batch.box(truck+Vector3(edge*1.611,2,seam),Vector3(0.012,2.02,0.025),"metal",TRIM)
for y in [1.08,2.88]:
batch.cylinder(truck+Vector3(edge*1.627,y,seam),0.025,0.025,"metal",STEEL,Vector3(0,0,PI/2))
var bus := Vector3(side*32,0,side*10)
for edge in [-1,1]:
rod(batch,bus+Vector3(edge*1.1,0.65,-4.5),bus+Vector3(edge*1.1,2.9,-4.5),0.03,TRIM)
rod(batch,bus+Vector3(edge*1.1,2.9,-4.5),bus+Vector3(edge*1.1,2.9,4.5),0.03,TRIM)
for z in [-4.0,-2.5,2.5,4.0]:
batch.box(bus+Vector3(edge*1.529,1.27,z),Vector3(0.02,0.07,0.8),"rubber",Color("252827"))
for z in [-3.0,3.0]:
batch.box(bus+Vector3(edge*0.85,2.985,z),Vector3(0.32,0.045,0.75),"paint",Color("c3c6b5"))
batch.finish(parent,"VehicleFittings")