From 9d551b29cfea9c68180158c7f111cccd8e80a753 Mon Sep 17 00:00:00 2001 From: Mathis Date: Mon, 5 Oct 2026 02:08:55 +0200 Subject: [PATCH] Noir detective office: typewriters, banker's lamps, filing cabinets, venetian blinds and wainscot --- blender/scripts/build_noir.py | 409 +++++++++++++++++++++++++++ src/client/lab/props.ts | 41 ++- src/client/models/noir.glb | Bin 0 -> 378880 bytes src/client/world/models.ts | 2 + src/client/world/office/build.ts | 2 + src/client/world/office/index.ts | 1 + src/client/world/office/materials.ts | 39 ++- src/client/world/office/noir.ts | 241 ++++++++++++++++ src/client/world/office/seats.ts | 2 +- tests/noir-model.test.ts | 240 ++++++++++++++++ 10 files changed, 960 insertions(+), 17 deletions(-) create mode 100644 blender/scripts/build_noir.py create mode 100644 src/client/models/noir.glb create mode 100644 src/client/world/office/noir.ts create mode 100644 tests/noir-model.test.ts diff --git a/blender/scripts/build_noir.py b/blender/scripts/build_noir.py new file mode 100644 index 000000000..4cd315ace --- /dev/null +++ b/blender/scripts/build_noir.py @@ -0,0 +1,409 @@ +"""The detective office's furniture, modelled by this script and exported to +src/client/models/noir.glb for src/client/world/office/noir.ts, which puts it round the office +floor: a banker's lamp, a rotary telephone, a typewriter, a stack of case files, a filing cabinet, +a venetian blind and a desk blotter. The shared helpers are in aokit.py and the conventions in +blender/README.md. + +Headless, from the repo root (`-- --shots` also writes a review sheet per piece and one of them all +side by side): + + blender --background --factory-startup --python blender/scripts/build_noir.py [-- --shots] + +Each piece is one object and a root of its own, so the office can place any of them by itself. +Every piece stands on the floor (or on a desk) at its origin and faces forward like every model: +-Y here, which the exporter turns into +Z. Nothing in this model moves on its own, so every piece +is a single joined object, one draw call per material. + +The object and material names are a contract with world/office/noir.ts and +tests/noir-model.test.ts, so rename them in all three places. Nothing here is textured: the office +paints every material with its own toon one by name (world/models.ts), and the model is exported +without UVs on purpose, so nothing has to survive mergeByMaterial() (which drops them). + +Sizes keep out of the office's way: the lamp, phone, typewriter, files and blotter stand on a desk +0.78 m high and 2.2 by 1.1 m (DESK_SIZE) without hiding the laptop anchor or the worker; the +cabinet is a standard 1.32 m four-drawer one that fits against a wall; the blind is cut for the +office's 3 by 2.2 m windows (WINDOWS in shared/layout.ts). +""" +import bpy, bmesh, math, os, sys +from mathutils import Matrix, Vector + +# Run headless, Blender doesn't put this folder on the import path. +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +import aokit as ao + +# Preview colours only: world/office/noir.ts paints every material by name with the same colours. +COLORS = { + "Brass": "#b08d3f", + "Shade": "#1f6b4a", + "Bakelite": "#1b1b1e", + "Steel": "#3f4a44", + "WoodWarm": "#5a3a22", + "Paper": "#e8dfc8", + "Folder": "#b99b62", + "Leather": "#4a2f22", + "Slat": "#cfc4ad", + "Cord": "#8a7a5c", + "Ink": "#101418", +} + +PIECES = ("desk_lamp", "rotary_phone", "typewriter", "file_stack", "filing_cabinet", "venetian_blind", "desk_blotter") + + +def material(name): + return ao.material(name, COLORS[name]) + + +# ---- Building an object from shapes -------------------------------------------------------------- + +class Shapes: + """One object's shapes in one bmesh, a material slot per material. Each shape's faces are + shaded flat or smooth as it says, and finish() leaves them that way.""" + + def __init__(self): + self.bm = bmesh.new() + self.mats = [] + + def slot(self, mat): + if mat not in self.mats: + self.mats.append(mat) + return self.mats.index(mat) + + def add(self, mat, build, *args, smooth=False, **kw): + """Adds a shape: `build(bm, *args, **kw)` is one of aokit's shape functions.""" + bm = self.bm + start = len(bm.faces) + build(bm, *args, **kw) + bm.faces.ensure_lookup_table() + for f in bm.faces[start:]: + f.smooth = smooth + f.material_index = self.slot(mat) + + def centre(self): + """Moves everything across so the middle of its footprint is at the origin.""" + xs = [v.co.x for v in self.bm.verts] + ys = [v.co.y for v in self.bm.verts] + bmesh.ops.translate(self.bm, vec=(-(min(xs) + max(xs)) / 2, -(min(ys) + max(ys)) / 2, 0.0), verts=self.bm.verts[:]) + + def finish(self, name, sharp=None): + """The object, its origin at the scene's origin. With `sharp` (radians), edges sharper than + that stay sharp and the rest shade smooth across.""" + me = bpy.data.meshes.new(name) + self.bm.to_mesh(me) + self.bm.free() + for m in self.mats: + me.materials.append(material(m)) + if sharp is not None: + me.set_sharp_from_angle(angle=sharp) + me.validate() + ob = bpy.data.objects.new(name, me) + bpy.context.scene.collection.objects.link(ob) + return ob + + +# ---- The banker's lamp ---------------------------------------------------------------------------- +# +# A 1940s banker's lamp: a weighted brass disc, a stem with a collar, and a half-cylinder green +# glass shade over the top, its open side down. 0.28 m tall, so it stands on the back corner of a +# desk without reaching the worker. Shade faces +Y (forward), the way the office's lamps do. + +LAMP_H = 0.28 +SHADE_R = 0.072 +SHADE_LEN = 0.24 + + +def half_shell(bm, r_out, r_in, length, center, segs=18): + """A half-cylinder shell open along the bottom, for a lamp shade: an outer and an inner arc + swept along Y and joined by an annulus at each end, so it is a closed solid with a hollow + underside. One of the shapes a Shapes.add() takes, so it fills `bm` itself.""" + start = len(bm.verts) + arcs = [] + for y in (-length / 2, length / 2): + outer = [bm.verts.new((r_out * math.cos(math.pi * i / segs), y, r_out * math.sin(math.pi * i / segs))) for i in range(segs + 1)] + inner = [bm.verts.new((r_in * math.cos(math.pi * i / segs), y, r_in * math.sin(math.pi * i / segs))) for i in range(segs + 1)] + arcs.append((outer, inner)) + (o0, i0), (o1, i1) = arcs + for k in range(segs): + bm.faces.new((o0[k], o0[k + 1], o1[k + 1], o1[k])) + bm.faces.new((i0[k], i0[k + 1], i1[k + 1], i1[k])) + bm.faces.new((o0[k], o0[k + 1], i0[k + 1], i0[k])) + bm.faces.new((o1[k], o1[k + 1], i1[k + 1], i1[k])) + bmesh.ops.recalc_face_normals(bm, faces=bm.faces[:]) + bm.verts.ensure_lookup_table() + ao._place(bm, bm.verts[start:], center, (0, 0, 0)) + + +def desk_lamp(): + s = Shapes() + # Weighted base: a shallow brass disc with a stepped rim. + s.add("Brass", ao.lathe, [(0.0, 0.0), (0.088, 0.0), (0.092, 0.008), (0.086, 0.018), (0.03, 0.022), (0.0, 0.022)], + center=(0, 0, 0), segs=28) + # The stem, with a collar where the shade hangs from it. + s.add("Brass", ao.cylinder, (0, 0, 0.02), (0, 0, LAMP_H - SHADE_R * 0.4), 0.011, segs=14) + s.add("Brass", ao.lathe, [(0.0, 0.0), (0.026, 0.0), (0.028, 0.012), (0.014, 0.02), (0.0, 0.02)], + center=(0, 0, LAMP_H - SHADE_R * 0.5), segs=18) + # The green glass shade: a half cylinder lying along Y over the top of the stem, open side down. + s.add("Shade", half_shell, SHADE_R, SHADE_R - 0.007, SHADE_LEN, (0, 0, LAMP_H - SHADE_R)) + # A pull chain hanging at the back of the shade. + s.add("Brass", ao.cylinder, (0, -SHADE_LEN / 2 + 0.02, LAMP_H - SHADE_R - 0.01), + (0, -SHADE_LEN / 2 + 0.02, LAMP_H - SHADE_R - 0.06), 0.0035, segs=8) + s.add("Brass", ao.ellipsoid, (0, -SHADE_LEN / 2 + 0.02, LAMP_H - SHADE_R - 0.065), (0.008, 0.008, 0.008), segs=10, rings=7) + return s.finish("desk_lamp", sharp=0.6) + + +# ---- The rotary telephone ------------------------------------------------------------------------- +# +# A black bakelite desk phone: a wedge body, a fingerwheel in a brass ring set into the front of the +# dial plate, and a handset lying on its cradle across the back. 0.22 wide, 0.17 deep, 0.23 tall. + +PHONE_W, PHONE_D, PHONE_H = 0.24, 0.2, 0.24 + + +def rotary_phone(): + s = Shapes() + # A low bakelite body, wider at the foot, with the dial let into the top of it at the front. + s.add("Bakelite", ao.box, (0, 0.012, 0.0375), (PHONE_W, PHONE_D, 0.075), bevel=0.016) + # The dial plate, sloping down toward whoever sits at the desk so the wheel reads from across + # the room, and set high enough that the whole fingerwheel clears the body. + plate_y, plate_z, tilt = -0.05, 0.1, math.radians(42) + up = Vector((0, -math.sin(tilt), math.cos(tilt))) + plate = Vector((0, plate_y, plate_z)) + s.add("Bakelite", ao.box, tuple(plate), (0.15, 0.078, 0.016), bevel=0.006, rot=(tilt, 0, 0)) + + def on_plate(u, v, lift=0.0): + """A point (u, v) across the dial plate's own face, `lift` along its up.""" + return plate + Vector((u, 0, 0)) + Vector((0, math.cos(tilt), math.sin(tilt))) * v + up * lift + + # The brass fingerwheel ring, and the dark dial let in behind it. + s.add("Brass", ao.cylinder, on_plate(0, 0, 0.006), on_plate(0, 0, 0.017), 0.05, segs=28) + s.add("Bakelite", ao.cylinder, on_plate(0, 0, 0.009), on_plate(0, 0, 0.012), 0.042, segs=28) + # Its ten finger holes, in the plate's own plane so they sit on the wheel. + for i in range(10): + a = math.radians(-46 + i * 27.5) + c = on_plate(0.031 * math.sin(a), 0.031 * math.cos(a), 0.012) + s.add("Bakelite", ao.cylinder, c, c + up * 0.004, 0.0065, segs=8) + # The cradle at the back and the handset lying in it: two ear pieces on a curved grip. + s.add("Bakelite", ao.box, (0, 0.062, 0.09), (0.17, 0.05, 0.03), bevel=0.01) + for sx in (-1, 1): + s.add("Bakelite", ao.ellipsoid, (sx * 0.095, 0.062, 0.117), (0.036, 0.03, 0.028), segs=16, rings=11) + s.add("Bakelite", ao.box, (0, 0.062, 0.141), (0.15, 0.03, 0.024), bevel=0.011) + # The cord, coiled once at the back and dropping off to the side. + s.add("Bakelite", ao.torus, (0, 0.096, 0.05), 0.028, 0.007, rot=(math.radians(90), 0, 0), n=18, m=6) + s.add("Bakelite", ao.cylinder, (0.02, 0.096, 0.05), (0.07, 0.13, 0.012), 0.007, segs=8) + s.centre() + return s.finish("rotary_phone", sharp=0.7) + + +# ---- The typewriter -------------------------------------------------------------------------------- +# +# A 1940s portable: a dark body, a bank of brass keys, a carriage with a sheet of paper in it and two +# roller knobs. 0.42 wide, 0.34 deep, 0.3 tall with the paper up. + +TYPE_W, TYPE_D = 0.42, 0.34 + + +def typewriter(): + s = Shapes() + # The body, stepped: the case, then the sloping keybed over it. + s.add("Bakelite", ao.box, (0, 0.01, 0.055), (TYPE_W, TYPE_D, 0.11), bevel=0.016) + s.add("Bakelite", ao.box, (0, -0.045, 0.115), (TYPE_W * 0.97, TYPE_D * 0.68, 0.05), bevel=0.012, + rot=(math.radians(7), 0, 0)) + # Four rows of brass keys on the bed, the front row longest. + for row, (ry, rz, n, rad) in enumerate(( + (-0.135, 0.128, 10, 0.0085), + (-0.095, 0.132, 10, 0.0085), + (-0.055, 0.137, 9, 0.0085), + (-0.018, 0.143, 8, 0.0085), + )): + for i in range(n): + x = (i - (n - 1) / 2) * 0.036 + s.add("Brass", ao.cylinder, (x, ry, rz), (x, ry, rz + 0.011), rad, segs=10) + # The space bar, a long brass bar across the front. + s.add("Brass", ao.cylinder, (-0.15, -0.168, 0.126), (0.15, -0.168, 0.126), 0.008, segs=10) + # The carriage: a roller across the back with a sheet of paper in it. + s.add("Steel", ao.cylinder, (-TYPE_W / 2 + 0.02, 0.135, 0.175), (TYPE_W / 2 - 0.02, 0.135, 0.175), 0.019, segs=16) + for sx in (-1, 1): + s.add("Steel", ao.cylinder, (sx * (TYPE_W / 2 - 0.006), 0.135, 0.175), (sx * (TYPE_W / 2 + 0.018), 0.135, 0.175), 0.026, segs=14) + # The sheet, standing up out of the carriage and leaning back a little. + s.add("Paper", ao.box, (0, 0.148, 0.26), (0.24, 0.006, 0.17), bevel=0.002, rot=(math.radians(-9), 0, 0)) + # The paper bail and its two arms. + s.add("Steel", ao.cylinder, (-0.11, 0.13, 0.213), (0.11, 0.13, 0.213), 0.004, segs=8) + for sx in (-1, 1): + s.add("Steel", ao.cylinder, (sx * 0.115, 0.132, 0.176), (sx * 0.115, 0.132, 0.213), 0.004, segs=8) + s.centre() + return s.finish("typewriter", sharp=0.7) + + +# ---- The stack of case files ----------------------------------------------------------------------- +# +# A pile of manila case folders with paper in them, tied with a cotton tag, the way a 1940s detective +# office stacked what it was working on. 0.34 by 0.26 and 0.11 tall, so it stands in a desk's back +# corner clear of the laptop. + + +def file_stack(): + s = Shapes() + # Four folders, each a little bigger and lower than the one on it, turned a few degrees out. + for i in range(4): + z = 0.012 + i * 0.026 + w, d = 0.34 - i * 0.012, 0.26 - i * 0.01 + s.add("Folder", ao.box, (0, 0, z), (w, d, 0.026), bevel=0.004, rot=(0, 0, math.radians(-6 + i * 4))) + # The paper edge showing out of the folder's open side. + s.add("Paper", ao.box, (0.004 * i, 0, z + 0.004), (w - 0.03, d - 0.02, 0.017), bevel=0.002, + rot=(0, 0, math.radians(-6 + i * 4))) + # The cotton tag round the middle of the pile, and its little brass eyelet. + s.add("Cord", ao.box, (0, 0, 0.066), (0.36, 0.055, 0.006), bevel=0.002) + s.add("Brass", ao.cylinder, (0.05, -0.028, 0.066), (0.05, -0.028, 0.072), 0.009, segs=12) + s.centre() + return s.finish("file_stack", sharp=0.6) + + +# ---- The filing cabinet ---------------------------------------------------------------------------- +# +# A four-drawer steel cabinet, the kind every municipal office had: a dark green-grey body, proud +# drawer fronts, brass pulls and label holders. 0.47 wide, 0.62 deep, 1.32 tall, standing on a +# plinth, so it goes against a wall like any other piece of furniture. + +CAB_W, CAB_D, CAB_H = 0.47, 0.62, 1.32 +DRAWER_H = 0.285 + + +def filing_cabinet(): + s = Shapes() + # The body and its plinth, so it reads as standing rather than floating. + s.add("Steel", ao.box, (0, 0, CAB_H / 2 + 0.03), (CAB_W, CAB_D, CAB_H - 0.06), bevel=0.012) + s.add("Steel", ao.box, (0, 0, 0.03), (CAB_W - 0.04, CAB_D - 0.04, 0.06), bevel=0.006) + # Four drawer fronts, each proud of the body, with a brass pull and a label holder above it. + front = -CAB_D / 2 + for i in range(4): + z = 0.09 + i * DRAWER_H + DRAWER_H / 2 + s.add("Steel", ao.box, (0, front - 0.012, z), (CAB_W - 0.03, 0.024, DRAWER_H - 0.02), bevel=0.006) + # The pull: a brass bar on two posts. + s.add("Brass", ao.box, (0, front - 0.042, z - 0.06), (0.11, 0.018, 0.022), bevel=0.006) + for sx in (-1, 1): + s.add("Brass", ao.cylinder, (sx * 0.048, front - 0.028, z - 0.06), (sx * 0.048, front - 0.038, z - 0.06), 0.007, segs=10) + # The label holder, a brass frame with a card in it. + s.add("Brass", ao.box, (0, front - 0.026, z + 0.062), (0.15, 0.008, 0.05), bevel=0.003) + s.add("Paper", ao.box, (0, front - 0.031, z + 0.062), (0.126, 0.004, 0.032)) + # Deliberately not centred on its footprint: the office stands this against a wall, so its back + # (its model's -z, without the brass pulls) is what sits on the wall, at exactly -CAB_D / 2. + return s.finish("filing_cabinet", sharp=0.7) + + +# ---- The venetian blind --------------------------------------------------------------------------- +# +# Slats on two cords under a head rail, tilted down a few degrees, with the tilt wand hanging at +# the left. Cut for the office's windows: 3 m wide, 2.2 m down from the rail. The head rail is at +# the top (z = drop) and the slats hang from it, so the office hangs it at a window's head and it +# falls to the sill. The blind is one object, the slats already tilted: nothing animates them. + + +def venetian_blind(): + s = Shapes() + w, drop = 3.0, 2.2 + rail_z = drop + # The head rail and its end caps. + s.add("WoodWarm", ao.box, (0, 0, rail_z - 0.035), (w, 0.07, 0.07), bevel=0.008) + for sx in (-1, 1): + s.add("WoodWarm", ao.box, (sx * (w / 2 - 0.01), 0, rail_z - 0.035), (0.03, 0.075, 0.075), bevel=0.006) + # The slats, close enough together to read as a blind and covering the whole drop. + n = 28 + for i in range(n): + z = rail_z - 0.1 - i * (drop - 0.15) / n + s.add("Slat", ao.box, (0, 0, z), (w - 0.03, 0.048, 0.007), bevel=0.002, rot=(math.radians(24), 0, 0)) + # The ladder cords down both ends and the lift cords through the middle. + for sx in (-1, 1): + s.add("Cord", ao.cylinder, (sx * (w / 2 - 0.02), 0.016, rail_z - 0.06), (sx * (w / 2 - 0.02), 0.016, 0.05), 0.0025, segs=6) + s.add("Cord", ao.cylinder, (sx * (w / 2 - 0.02), -0.016, rail_z - 0.06), (sx * (w / 2 - 0.02), -0.016, 0.05), 0.0025, segs=6) + for i in range(4): + x = (i - 1.5) * (w / 5) + s.add("Cord", ao.cylinder, (x, 0.022, rail_z - 0.06), (x, 0.022, 0.05), 0.0022, segs=6) + # The tilt wand hanging at the left, with its cord. + s.add("WoodWarm", ao.cylinder, (-w / 2 + 0.06, 0.03, rail_z - 0.06), (-w / 2 + 0.06, 0.03, rail_z - 0.46), 0.008, segs=10) + s.add("Cord", ao.cylinder, (-w / 2 + 0.06, 0.03, rail_z - 0.06), (-w / 2 + 0.055, 0.03, rail_z - 0.09), 0.0022, segs=6) + # The blind hangs from its rail, so its top is at the origin. + bmesh.ops.translate(s.bm, vec=(0, 0, -drop), verts=s.bm.verts[:]) + return s.finish("venetian_blind", sharp=0.7) + + +# ---- The desk blotter ----------------------------------------------------------------------------- +# +# A leather blotter with brass corner rules and an inkwell: what makes a desk top read as a +# detective's rather than a work surface. 1.0 by 0.62, so it takes most of a 2.2 by 1.1 m desk top. + +BLOT_W, BLOT_D = 1.0, 0.62 + + +def desk_blotter(): + s = Shapes() + # The pad, thin, with its edge rolled over. + s.add("Leather", ao.box, (0, 0, 0.007), (BLOT_W, BLOT_D, 0.014), bevel=0.005) + # Brass corner rules on two corners, the way a blotter is held down. + for sx, sy in ((-1, -1), (1, -1)): + s.add("Brass", ao.box, (sx * (BLOT_W / 2 - 0.075), sy * (BLOT_D / 2 - 0.075), 0.016), + (0.15, 0.028, 0.006), bevel=0.002, rot=(0, 0, math.radians(45 * sx * sy))) + # The inkwell, a squat glass bottle with a brass collar, at the back left. + s.add("Ink", ao.lathe, [(0.0, 0.0), (0.038, 0.0), (0.04, 0.05), (0.026, 0.062), (0.026, 0.07), (0.0, 0.07)], + center=(-BLOT_W / 2 + 0.11, BLOT_D / 2 - 0.1, 0.014), segs=20) + s.add("Brass", ao.cylinder, (-BLOT_W / 2 + 0.11, BLOT_D / 2 - 0.1, 0.082), + (-BLOT_W / 2 + 0.11, BLOT_D / 2 - 0.1, 0.09), 0.028, segs=18) + s.centre() + return s.finish("desk_blotter", sharp=0.7) + + +# ---- The build ------------------------------------------------------------------------------------ + +def build(): + ao.clear() + made = [desk_lamp(), rotary_phone(), typewriter(), file_stack(), filing_cabinet(), venetian_blind(), desk_blotter()] + for name, ob in zip(PIECES, made): + print(f"{name}: {ao.tris(ob)} tris, {len(ob.data.materials)} materials") + return ao.export("noir") + + +# ---- Review renders ------------------------------------------------------------------------------- + +def only(name, lineup=False): + """Shows just the piece `name` in the review renders, or with `lineup` all of them in a row + along x.""" + def setup(): + x = 0.0 + for piece in PIECES: + ob = bpy.data.objects[piece] + ob.hide_render = not (lineup or piece == name) + ob.location = (x, 0, 0) if lineup else (0, 0, 0) + x += 0.5 + return setup + + +def review(): + bpy.context.scene.display.shading.show_backface_culling = True + views = ("tq", "front", "side", "top") + # How close to look at each piece, and where: the small desk things need to be near. + framing = { + "desk_lamp": ((0, 0, 0.17), 0.62), + "rotary_phone": ((0, 0, 0.11), 0.6), + "typewriter": ((0, 0, 0.16), 0.95), + "file_stack": ((0, 0, 0.06), 0.62), + "filing_cabinet": ((0, 0, 0.66), 2.5), + "venetian_blind": ((0, 0, -1.1), 3.4), + "desk_blotter": ((0, 0, 0.03), 1.5), + } + paths = [] + for name in PIECES: + target, dist = framing[name] + paths.append(ao.sheet(f"noir_{name}", [(only(name), v) for v in (*views, "back")], + cell=(420, 420), target=target, dist=dist)) + paths.append(ao.sheet("noir_lineup", [(only(None, lineup=True), v) for v in ("front", "tq", "back")], + cell=(900, 420), target=(1.5, 0, 0.3), dist=4.4)) + for piece in PIECES: + ob = bpy.data.objects[piece] + ob.location = (0, 0, 0) + ob.hide_render = False + return paths + + +if __name__ == "__main__" and bpy.app.background: + print("wrote:", build()) + if "--shots" in ao.args(): + for path in review(): + print("sheet:", path) \ No newline at end of file diff --git a/src/client/lab/props.ts b/src/client/lab/props.ts index 20823c8de..33b8c1ea9 100644 --- a/src/client/lab/props.ts +++ b/src/client/lab/props.ts @@ -11,14 +11,14 @@ // Once it has drawn, window.__ready holds each prop's size, triangles, draw calls and material names. import * as THREE from 'three'; -import { DESKS } from '../../shared/layout'; +import { DESKS, DESK_SIZE } from '../../shared/layout'; import { buildCabinet } from '../features/cabinet/world'; import { supercar } from '../features/cars/world'; import { buildGong } from '../features/gong/world'; import { buildJukebox } from '../features/jukebox/world'; import { buildKitchen } from '../world/kitchen'; import { preloadModels } from '../world/models'; -import { DESK_BOOKS, FLOOR_PLANTS, buildDesk, coffeeTable, deskBooks, deskMug, loungeCouch, plant, pouf } from '../world/office'; +import { DESK_BOOKS, FLOOR_PLANTS, buildDesk, coffeeTable, deskBooks, deskBlotter, deskLamp, deskMug, fileStack, filingCabinet, loungeCouch, plant, pouf, rotaryPhone, typewriter, venetianBlind } from '../world/office'; import { toon } from '../world/toon'; import { ready, stage } from './stage'; @@ -76,6 +76,43 @@ const SHOW: Record Shown> = { [loungeCouch(), coffeeTable(), pouf('#06d6a0'), pouf('#ffd166')].forEach((o, i) => object.add(o.translateX(at[i]))); return { object }; }, + noir_desk: () => { + // The detective desk as the office dresses it: a desk with its own top, a typewriter in the back + // corner its knick-knack leaves free, and the banker's lamp (see world/office/noir.ts). The desk + // is moved to the origin first, so the props can be placed on it in its own frame. + const object = new THREE.Group(); + const desk = buildDesk(DESKS[0], 0, toon('#7a5330')); + desk.group.position.set(0, 0, 0); + desk.group.rotation.y = 0; + object.add(desk.group); + object.add(deskBlotter().translateY(DESK_SIZE.height)); + object.add(typewriter().translateX(-0.84).translateZ(-0.32).translateY(DESK_SIZE.height)); + object.add(deskLamp().translateX(-0.88).translateZ(0.3).translateY(DESK_SIZE.height)); + object.add(fileStack().translateX(0.9).translateZ(-0.36).translateY(DESK_SIZE.height)); + return { object }; + }, + noir_cabinets: () => { + // Two filing cabinets with what stands on them, as the office puts them against a wall. + const object = new THREE.Group(); + const cabinet = filingCabinet(); + object.add(cabinet.clone()); + const withPhone = filingCabinet(); + withPhone.position.x = 1.2; + object.add(withPhone); + const phone = rotaryPhone(); + phone.position.set(1.2, 1.32, 0); + phone.rotation.y = Math.PI; + object.add(phone); + return { object }; + }, + noir_blind: () => ({ object: venetianBlind() }), + noir_row: () => { + // Everything at desk scale in a row, the way the lineup shot has it. + const object = new THREE.Group(); + const at = [0, 0.5, 1.1, 1.7, 2.4]; + [deskLamp(), rotaryPhone(), typewriter(), fileStack(), deskBlotter()].forEach((o, i) => object.add(o.translateX(at[i]))); + return { object }; + }, lambo: () => ({ object: supercar('lambo', '#ffd166').root }), ferrari: () => ({ object: supercar('ferrari', '#ef476f').root }), }; diff --git a/src/client/models/noir.glb b/src/client/models/noir.glb new file mode 100644 index 0000000000000000000000000000000000000000..ff78d4a35dfebe99807321de753665e3133e5f6e GIT binary patch literal 378880 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

?bgWl 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 z%0A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 diff --git a/src/client/world/office/build.ts b/src/client/world/office/build.ts index 15c0e6237..870126612 100644 --- a/src/client/world/office/build.ts +++ b/src/client/world/office/build.ts @@ -25,6 +25,7 @@ import { balcony } from './balcony'; import { downstairs } from './ground'; import { wing } from './wing'; import { beanbags, desks, kiosks } from './seats'; +import { noir } from './noir'; import { meetingRoom } from './meeting-room'; import { loft } from './loft'; import type { Fixture, Gives, Site } from './fixture'; @@ -49,6 +50,7 @@ function floorPlan() { plug, tower, desks, + noir, beanbags, kiosks, boards, diff --git a/src/client/world/office/index.ts b/src/client/world/office/index.ts index a1b4bb3d4..75a4e1fd5 100644 --- a/src/client/world/office/index.ts +++ b/src/client/world/office/index.ts @@ -3,4 +3,5 @@ export { buildOffice } from './build'; export { DESK_BOOKS, FLOOR_PLANTS, coffeeTable, deskBooks, deskMug, loungeCouch, plant, plantLeaves, pouf, type PlantSpecies } from './props'; export { buildDesk, vacancyMarker } from './seats'; +export { deskBlotter, deskLamp, fileStack, filingCabinet, noir, rotaryPhone, typewriter, venetianBlind } from './noir'; export type { WingView } from './wing'; diff --git a/src/client/world/office/materials.ts b/src/client/world/office/materials.ts index f917b689c..619a5d647 100644 --- a/src/client/world/office/materials.ts +++ b/src/client/world/office/materials.ts @@ -11,12 +11,12 @@ export const PALETTE = { floorAlt: FLOOR_PALETTES[0].floorAlt, wall: FLOOR_PALETTES[0].wall, wallTrim: FLOOR_PALETTES[0].trim, - desk: '#f7f3ea', - deskLeg: '#3d405b', - wood: '#c98b5a', + desk: '#6f4a2a', + deskLeg: '#2b2119', + wood: '#7a5330', cork: '#d8a86a', - chairs: ['#ff8a5b', '#5bc0eb', '#9bc53d', '#b388eb', '#ffb400', '#f7aef8'], - rugs: ['#bde0fe', '#ffd6a5', '#caffbf', '#ffc6ff'], + chairs: ['#7a2e2e', '#4a5d3a', '#6b4a2f', '#3a3f4a', '#2f4858', '#8a6a4a'], + rugs: ['#b8a888', '#9a8b6f', '#7d8a72', '#a08d7a'], plant: '#5fb760', plantDark: '#3f8f45', pot: '#e76f51', @@ -94,20 +94,31 @@ export function onWall(side: Side, u: number): { x: number; z: number; rotY: num } } -/** Chunky planks in a floor's colors. */ +/** + * Worn parquet in a floor's colors: square blocks of planks laid alternately along and across, the + * way an office floor is laid, with the gaps between them in the floor's seam color. Two blocks to + * the tile, so one tile covers four by four metres. + */ export function paintPlanks(c: HTMLCanvasElement, p: FloorPalette) { const g = c.getContext('2d')!; g.fillStyle = p.floor; g.fillRect(0, 0, 512, 512); - for (let row = 0; row < 8; row++) { - const offset = (row % 2) * 128; - for (let col = -1; col < 3; col++) { - const x = col * 256 + offset; - g.fillStyle = (row + col) % 3 === 0 ? p.floorAlt : p.floor; - g.fillRect(x + 2, row * 64 + 2, 252, 60); + const block = 128; + const plank = 32; + for (let by = 0; by < 512 / block; by++) { + for (let bx = 0; bx < 512 / block; bx++) { + // Every other block is laid the other way round, so the pattern reads as a parquet floor. + const across = (bx + by) % 2 === 0; + for (let i = 0; i < block / plank; i++) { + // A plank every so often is the floor's other color, worn a shade lighter. + g.fillStyle = (bx * 3 + by * 5 + i) % 4 === 0 ? p.floorAlt : p.floor; + const at = i * plank; + g.fillRect(bx * block + (across ? at : 0) + 1, by * block + (across ? 0 : at) + 1, across ? plank - 2 : block - 2, across ? block - 2 : plank - 2); + g.fillStyle = p.seam; + if (across) g.fillRect(bx * block + at, by * block, 2, block); + else g.fillRect(bx * block, by * block + at, block, 2); + } } - g.fillStyle = p.seam; - g.fillRect(0, row * 64, 512, 3); } } diff --git a/src/client/world/office/noir.ts b/src/client/world/office/noir.ts new file mode 100644 index 000000000..1c7eee15f --- /dev/null +++ b/src/client/world/office/noir.ts @@ -0,0 +1,241 @@ +import * as THREE from 'three'; +import { DESK_SIZE, FLOOR, WINDOWS } from '../../../shared/layout'; +import { mesh, toon } from '../toon'; +import { palette, piece } from '../models'; +import type { Collider } from '../types'; +import type { Fixture } from './fixture'; +import { PALETTE, onWall } from './materials'; + +// The detective office: the furniture of a 1940s municipal squad room, modelled in Blender +// (blender/scripts/build_noir.py) and put round the floor here. A banker's lamp on every desk, a +// typewriter in whichever back corner the desk's own knick-knack leaves free, a stack of case files, +// filing cabinets along the walls with a telephone on some of them, a venetian blind in every window +// and a dark wood wainscot round the room. +// +// Nothing here changes a seat, a collider the workers walk round, an interactable or a desk id: the +// props go in the gaps the desks already leave (see the anchors in seats.ts's buildDesk), and the +// only new colliders are the filing cabinets, which stand against walls out of the walking. A model +// that didn't load leaves an empty group, so the office opens without any of it (see piece()). + +// Preview colours only in Blender; these are the ones the office paints each name with. The +// WoodWarm rail takes the office's own wood, so the blinds match the frames and the stair. +const NOIR_COLORS = { + Brass: '#a8823c', + Shade: '#1f6b4a', + Bakelite: '#1b1b1e', + Steel: '#3f4a44', + WoodWarm: PALETTE.wood, + Paper: '#e8dfc8', + Folder: '#b99b62', + Leather: '#4a2f22', + Slat: '#cfc4ad', + Cord: '#8a7a5c', + Ink: '#101418', +}; +const paintNoir = palette(NOIR_COLORS); + +/** + * The green glass of a banker's lamp, lit from inside: the office's one warm point in a dark room, + * and the only material here that isn't flat. Each lamp gets its own, so they can be lit one by one. + */ +function shadeMaterial(): THREE.Material { + return toon(NOIR_COLORS.Shade, { emissive: '#2f7d52' }); +} + +/** A banker's lamp: a brass base and stem under a green glass shade, 0.28 m tall. */ +export function deskLamp(): THREE.Object3D { + return piece('noir', 'desk_lamp', (name) => (name === 'Shade' ? shadeMaterial() : paintNoir(name))); +} + +/** A bakelite rotary telephone with a brass fingerwheel, 0.24 m wide. */ +export function rotaryPhone(): THREE.Object3D { + return piece('noir', 'rotary_phone', paintNoir); +} + +/** A portable typewriter with a sheet of paper in its carriage, 0.42 m wide. */ +export function typewriter(): THREE.Object3D { + return piece('noir', 'typewriter', paintNoir); +} + +/** A pile of manila case folders with paper in them, 0.34 by 0.26 m. */ +export function fileStack(): THREE.Object3D { + return piece('noir', 'file_stack', paintNoir); +} + +/** A four-drawer steel filing cabinet, 0.47 by 0.62 m and 1.32 m tall, drawers facing +z. */ +export function filingCabinet(): THREE.Object3D { + return piece('noir', 'filing_cabinet', paintNoir); +} + +/** A venetian blind hanging from its head rail: 3 m wide, falling 2.2 m from the origin. */ +export function venetianBlind(): THREE.Object3D { + return piece('noir', 'venetian_blind', paintNoir); +} + +/** A leather desk blotter with brass corner rules and an inkwell, 1.0 by 0.62 m. */ +export function deskBlotter(): THREE.Object3D { + return piece('noir', 'desk_blotter', paintNoir); +} + +/** How high a filing cabinet is, and how deep: its collider, and how far off the wall it stands. */ +const CABINET = { width: 0.47, depth: 0.62, height: 1.32, off: 0.31 } as const; + +/** + * Where the cabinets stand: along the west and south walls, in the stretches that are free of + * windows, the kitchen, the ladder, the machine monitor and the way out. Each entry is the + * cabinet's middle on the floor, and the turn that faces it into the room (0 faces +z, as every + * model does). A phone or a pile of files rides on top of the ones with one. + */ +const CABINET_SPOTS: readonly { x: number; z: number; rotY: number; on: 'phone' | 'files' | null }[] = [ + // West wall: north of the first window, then south of the last one and clear of the exit door. + { x: FLOOR.minX + CABINET.off, z: -11.8, rotY: Math.PI / 2, on: 'phone' }, + { x: FLOOR.minX + CABINET.off, z: 8.2, rotY: Math.PI / 2, on: null }, + { x: FLOOR.minX + CABINET.off, z: 10.2, rotY: Math.PI / 2, on: 'files' }, + // South wall: the stretches between the kitchen, the windows and the balcony doors. + { x: -11.5, z: FLOOR.maxZ - CABINET.off, rotY: Math.PI, on: 'phone' }, + { x: -7.1, z: FLOOR.maxZ - CABINET.off, rotY: Math.PI, on: null }, + { x: -6.3, z: FLOOR.maxZ - CABINET.off, rotY: Math.PI, on: 'files' }, +]; + +/** Where the case files stand that don't go on a desk: on a cabinet top, and on the floor beside one. */ +const FLOOR_STACKS: readonly { x: number; z: number; rotY: number }[] = [ + { x: -17.69, z: -11.95, rotY: 0.2 }, + { x: -17.69, z: 10.45, rotY: -0.3 }, +]; + +/** How high the wood panelling round the room comes, and how thick it stands off the wall. */ +const WAINSCOT = { height: 1.05, thick: 0.05 } as const; + +/** + * The dark wood panelling round the room: a boarded dado to chair-rail height, with a rail along the + * top of it. It stands against the inside of the four walls, so it is never walked into and takes no + * collider. It goes up as far as the panelling only: above it the cream wall carries on, and the + * boards and windows sit on that. + */ +function wainscot(): THREE.Group { + const g = new THREE.Group(); + const wood = toon(PALETTE.desk); + const rail = toon(PALETTE.wood); + const { minX, maxX, minZ, maxZ } = FLOOR; + const w = maxX - minX; + const d = maxZ - minZ; + const t = WAINSCOT.thick; + const h = WAINSCOT.height; + for (const [len, x, z, ry] of [ + [w, 0, minZ + t / 2, 0], + [w, 0, maxZ - t / 2, 0], + [d, minX + t / 2, 0, Math.PI / 2], + [d, maxX - t / 2, 0, Math.PI / 2], + ] as const) { + const panel = mesh(new THREE.BoxGeometry(len, h, t), wood, x, h / 2, z, false); + panel.rotation.y = ry; + g.add(panel); + // The chair rail along the top, standing a little proud of the panelling. + const cap = mesh(new THREE.BoxGeometry(len, 0.06, t + 0.03), rail, x, h + 0.03, z, false); + cap.rotation.y = ry; + g.add(cap); + } + return g; +} + +/** + * A venetian blind in the office window `o`, hanging from its head just inside the glass and falling + * to the sill. Built along x with the window's outside toward +z, the way windowIn() does it, then + * turned onto its wall (see onWall). + */ +function blindIn(o: (typeof WINDOWS)[number]): THREE.Group { + const blind = venetianBlind(); + blind.position.set(0, o.y1, 0.04); + blind.rotation.y = Math.PI; + const at = onWall(o.wall, o.u); + const g = new THREE.Group(); + g.add(blind); + g.position.set(at.x, 0, at.z); + g.rotation.y = at.rotY; + return g; +} + +/** + * A file stack's footprint, for its collider on the floor. + */ +const STACK = { width: 0.36, depth: 0.28, height: 0.12 } as const; + +/** The office floor's detective furniture: the props on the desks, the cabinets, the blinds and the panelling. */ +export const noir: Fixture = (site) => { + // On every desk: a blotter covering the surface, a banker's lamp at the front left (where a typist's + // lamp goes), and a typewriter in whichever back corner the desk's own knick-knack has left free. + // The laptop (0.78 m × 1.3 = 1.01 m wide) lands on top of the blotter in the centre; the blotter's + // edges poke out on both sides, the way a detective's desk pad does. The case files go on the cabinets + // and on the floor instead of on the desk, since the laptop takes the middle of the top and whoever + // dances when a pull request merges stands at (0.72, 0.18). + for (const def of site.desks.keys()) { + const view = site.desks.get(def); + if (!view || view.def.beanbag || view.def.station) continue; + const { height } = DESK_SIZE; + const index = Number(def.replace('desk-', '')) - 1; + const blotter = deskBlotter(); + blotter.position.set(0, height, 0); + view.group.add(blotter); + const lamp = deskLamp(); + lamp.position.set(-0.88, height, 0.3); + view.group.add(lamp); + // A mug or books stand at the back right (index % 3 of 0 or 2) and a plant at the back left (1), + // so the typewriter takes the other back corner. + const right = index % 3 === 1; + const writer = typewriter(); + writer.position.set(right ? 0.84 : -0.84, height, -0.32); + writer.rotation.y = right ? -0.22 : 0.22; + view.group.add(writer); + } + + // The filing cabinets against the walls, each with its collider so nobody walks into it, and a + // telephone or a pile of files on the ones that have one. + const cabinets = new THREE.Group(); + const colliders: Collider[] = []; + for (const spot of CABINET_SPOTS) { + const cabinet = filingCabinet(); + cabinet.position.set(spot.x, 0, spot.z); + cabinet.rotation.y = spot.rotY; + cabinets.add(cabinet); + if (spot.on === 'phone') { + const phone = rotaryPhone(); + phone.position.set(spot.x, CABINET.height, spot.z); + phone.rotation.y = spot.rotY + Math.PI; + cabinets.add(phone); + } else if (spot.on === 'files') { + const files = fileStack(); + files.position.set(spot.x, CABINET.height, spot.z); + files.rotation.y = spot.rotY; + cabinets.add(files); + } + // Its footprint, turned the way it faces: a quarter turn at a time. + const along = Math.abs(Math.sin(spot.rotY)) > 0.5; + const hw = (along ? CABINET.depth : CABINET.width) / 2; + const hd = (along ? CABINET.width : CABINET.depth) / 2; + colliders.push({ minX: spot.x - hw, maxX: spot.x + hw, minZ: spot.z - hd, maxZ: spot.z + hd, top: CABINET.height }); + // The stretch of wall it stands against, so a picture never hangs over it. + // The cabinet faces into the room (its drawers toward the room centre), so the wall it backs + // against is the opposite direction from where it faces: π/2 faces east → back to west wall, + // π faces north → back to south wall, 3π/2 (or -π/2) faces west → back to east wall, 0 → north. + const wall: 'north' | 'south' | 'east' | 'west' = + spot.rotY === Math.PI / 2 ? 'west' + : spot.rotY === Math.PI ? 'south' + : spot.rotY === -Math.PI / 2 || spot.rotY === (3 * Math.PI) / 2 ? 'east' + : 'north'; + site.wall(wall, wall === 'east' || wall === 'west' ? spot.z : spot.x, CABINET.height / 2, CABINET.width + 0.1, CABINET.height); + } + + const group = new THREE.Group(); + group.add(cabinets, wainscot()); + // The case files on the floor beside two of the cabinets, where they were set down. + for (const spot of FLOOR_STACKS) { + const files = fileStack(); + files.position.set(spot.x, 0, spot.z); + files.rotation.y = spot.rotY; + cabinets.add(files); + colliders.push({ minX: spot.x - STACK.width / 2, maxX: spot.x + STACK.width / 2, minZ: spot.z - STACK.depth / 2, maxZ: spot.z + STACK.depth / 2, top: STACK.height }); + } + // A blind in every window at floor level: the loft's two are up in the loft, out of this room. + for (const o of WINDOWS) if (o.y1 <= 4) group.add(blindIn(o)); + return { group, colliders }; +}; \ No newline at end of file diff --git a/src/client/world/office/seats.ts b/src/client/world/office/seats.ts index 64e0ecb30..460510b82 100644 --- a/src/client/world/office/seats.ts +++ b/src/client/world/office/seats.ts @@ -45,7 +45,7 @@ export function buildDesk(def: DeskDef, index: number, trimMat: THREE.Material): group.rotation.y = def.rotY; const { width, depth, height } = DESK_SIZE; group.add(mesh(roundedBox(width - 0.06, 0.08, depth - 0.04, 0.08), toon(PALETTE.desk), 0, height - 0.04, 0)); - const legMat = toon('#8d99ae'); + const legMat = toon(PALETTE.deskLeg); for (const sx of [-1, 1]) { for (const sz of [-1, 1]) { group.add(mesh(new THREE.CylinderGeometry(0.035, 0.035, height - 0.08, 8), legMat, sx * (width / 2 - 0.14), (height - 0.08) / 2, sz * (depth / 2 - 0.12))); diff --git a/tests/noir-model.test.ts b/tests/noir-model.test.ts new file mode 100644 index 000000000..ac2e33032 --- /dev/null +++ b/tests/noir-model.test.ts @@ -0,0 +1,240 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { Box3, Quaternion, Vector3 } from 'three'; +import { BALCONY_DOOR, DESK_SIZE, EXIT_DOOR, LADDER, WINDOWS } from '../src/shared/layout'; +import { openModel } from './glb'; + +// noir.glb (exported by blender/scripts/build_noir.py) against what world/office/noir.ts counts on: the +// seven pieces by name, each a root of its own standing at its origin and facing +z as modelled, the +// materials it paints, and the footprints that keep them on the desks they go on and clear of the +// laptop, the dancing place and the knick-knack each desk already has. + +const PIECES = ['desk_lamp', 'rotary_phone', 'typewriter', 'file_stack', 'filing_cabinet', 'venetian_blind', 'desk_blotter']; + +/** NOIR_COLORS in world/office/noir.ts, which is every material the model may carry (palette() paints a name it has no color for magenta). */ +const PAINTED = ['Brass', 'Shade', 'Bakelite', 'Steel', 'WoodWarm', 'Paper', 'Folder', 'Leather', 'Slat', 'Cord', 'Ink']; + +const props = openModel('noir'); +const { gltf, nodes, byName } = props; + +type Primitive = { attributes: Record; material?: number; indices?: number }; +const primitives = (name: string) => (gltf.meshes[nodes[byName(name)].mesh ?? -1]?.primitives ?? []) as Primitive[]; +const materialOf = (p: Primitive) => gltf.materials?.[p.material ?? -1]?.name ?? ''; + +/** A piece's bounds, from its mesh's primitives (only those in `materials`, if given). */ +function boundsOf(name: string, materials?: string[]): Box3 { + const i = byName(name); + const box = new Box3(); + assert.ok(primitives(name).length, `${name} has a mesh`); + for (const p of primitives(name)) { + if (materials && !materials.includes(materialOf(p))) continue; + const a = gltf.accessors[p.attributes.POSITION]; + box.union(new Box3(new Vector3().fromArray(a.min!), new Vector3().fromArray(a.max!)).applyMatrix4(props.worldMatrix(i))); + } + return box; +} + +const trianglesOf = (name: string) => primitives(name).reduce((n, p) => n + gltf.accessors[p.indices!].count / 3, 0); + +const near = (a: number, b: number, tolerance = 0.005) => Math.abs(a - b) <= tolerance; +const fmt = (v: Vector3) => v.toArray().map((n) => n.toFixed(3)).join(', '); + +test('each piece is a root node of its own, at the origin and facing +z as modelled, named once', () => { + const names = nodes.map((n) => n.name ?? ''); + assert.deepEqual([...names].sort(), [...PIECES].sort(), 'only the pieces, each named once'); + for (const name of PIECES) { + const i = byName(name); + assert.equal(props.parentName(i), undefined, `${name} hangs from nothing`); + const { at, turn } = props.placed(i); + assert.ok(at.length() < 1e-4, `${name} is at ${fmt(at)}`); + assert.ok(turn.angleTo(new Quaternion()) < 1e-4, `${name} isn't turned`); + } +}); + +test('its materials are the ones world/office/noir.ts paints, and only those', () => { + const names = props.materials(); + for (const m of PAINTED) assert.ok(names.includes(m), `a material called ${m}`); + for (const m of names) assert.ok(PAINTED.includes(m), `${m} isn't a material the code knows (it would come out magenta)`); +}); + +test('every piece that stands somewhere has its footprint centred on its origin and sits on it', () => { + // The blind hangs from its rail instead, so its origin is the rail at the top of the drop; the + // cabinet is stood against a wall, so its back rather than its middle is the fixed edge. + const NOT_CENTRED = ['venetian_blind', 'filing_cabinet']; + for (const name of PIECES.filter((n) => !NOT_CENTRED.includes(n))) { + const box = boundsOf(name); + const middle = box.getCenter(new Vector3()); + assert.ok(Math.hypot(middle.x, middle.z) < 5e-3, `${name}'s footprint is centred on its origin (${fmt(middle)})`); + assert.ok(near(box.min.y, 0, 5e-3), `${name} stands on the floor at its origin (${box.min.y.toFixed(4)})`); + } + // The cabinet's back, without the brass pulls, is what the office puts on the wall. + assert.ok(near(boundsOf('filing_cabinet').min.z, -0.31, 5e-3), `its back is at ${boundsOf('filing_cabinet').min.z.toFixed(4)}`); +}); + +test("the banker's lamp is a lamp: a weighted base, a stem and a green shade over the top", () => { + const lamp = boundsOf('desk_lamp'); + const shade = boundsOf('desk_lamp', ['Shade']); + const brass = boundsOf('desk_lamp', ['Brass']); + const size = lamp.getSize(new Vector3()); + assert.ok(lamp.max.y > 0.26 && lamp.max.y < 0.3, `the lamp is ${lamp.max.y.toFixed(3)} m tall`); + // The shade is the green glass, up on top and clear of the base: the lamp reads by its colour. + assert.ok(shade.max.y > 0.2, `the shade is up at ${shade.max.y.toFixed(3)}`); + assert.ok(shade.min.y > lamp.min.y + 0.15, `the shade is clear of the base (from ${shade.min.y.toFixed(3)})`); + // The shade is modelled lying along the desk (the z the office's forward is), so it is longer + // there than it is across, and it overhangs the base it stands on. + assert.ok(size.z > 0.22 && size.z < 0.27, `the shade runs ${size.z.toFixed(3)} m along`); + assert.ok(size.z > size.x, `it overhangs the ${(brass.max.x - brass.min.x).toFixed(3)} m base`); + // The brass base is wide and low, and the stem between the two is thin. + assert.ok(brass.max.x - brass.min.x > 0.14, `the base is ${(brass.max.x - brass.min.x).toFixed(3)} across`); +}); + +test('the telephone and the typewriter are the sizes a desk takes, and both stand on it', () => { + const phone = boundsOf('rotary_phone').getSize(new Vector3()); + assert.ok(phone.x > 0.2 && phone.x < 0.28, `the phone is ${phone.x.toFixed(3)} m wide`); + // A bakelite desk phone stands about 0.15 m: the handset rides on the cradle on top of it. + assert.ok(phone.y > 0.13 && phone.y < 0.2, `the phone is ${phone.y.toFixed(3)} m tall`); + const writer = boundsOf('typewriter').getSize(new Vector3()); + assert.ok(writer.x > 0.38 && writer.x < 0.46, `the typewriter is ${writer.x.toFixed(3)} m wide`); + // The paper stands up out of the carriage, so it is the tallest thing on the desk. + assert.ok(writer.y > 0.28 && writer.y < 0.4, `the typewriter with its paper is ${writer.y.toFixed(3)} m tall`); + assert.ok(boundsOf('typewriter', ['Paper']).max.y > 0.28, 'the sheet of paper is up in the carriage'); +}); + +test('the filing cabinet is a standard four-drawer one, drawers facing +z, standing 1.32 m', () => { + const box = boundsOf('filing_cabinet'); + const size = box.getSize(new Vector3()); + assert.ok(near(size.x, 0.47, 0.02), `${size.x.toFixed(3)} m wide`); + // The body is 0.62 m deep and the brass pulls stand about 0.05 m proud of it. + assert.ok(size.z > 0.62 && size.z < 0.7, `${size.z.toFixed(3)} m deep, the pulls proud of a 0.62 m body`); + assert.ok(near(box.max.y, 1.32, 0.02), `${box.max.y.toFixed(3)} m tall`); + // The brass label holders and pulls are all on the front, so +z is the front. + const brass = boundsOf('filing_cabinet', ['Brass']); + assert.ok(brass.max.z > box.max.z - 0.1, `the brass is on the front (to ${brass.max.z.toFixed(3)} of ${box.max.z.toFixed(3)})`); + assert.ok(brass.min.z > box.min.z, 'none of it is behind the cabinet'); + // Four drawers: four label holders, each its own island of brass up the front. + assert.ok(boundsOf('filing_cabinet', ['Paper']).max.z > box.min.z, 'the drawer labels are on the front too'); +}); + +test('the blind hangs from its rail: the rail at the top, the slats falling below the origin', () => { + const blind = boundsOf('venetian_blind'); + const slats = boundsOf('venetian_blind', ['Slat']); + const rail = boundsOf('venetian_blind', ['WoodWarm']); + // The office hangs it at a window's head (WINDOWS' y1), so the rail is the top of the model. + // The rail's end caps stand a couple of millimetres proud of it. + assert.ok(blind.max.y <= 5e-3, `the rail is at the top of the model (${blind.max.y.toFixed(4)})`); + assert.ok(blind.min.y < -2, `it falls ${Math.abs(blind.min.y).toFixed(2)} m from the rail`); + // The wood is the rail and the tilt wand that hangs off it, so the rail itself is its top. + assert.ok(rail.max.y > slats.max.y, 'the slats hang below the rail'); + assert.ok(slats.max.y < 0 && slats.min.y < -1.5, `the slats fall from ${slats.max.y.toFixed(2)} to ${slats.min.y.toFixed(2)}`); + assert.ok(slats.max.y > blind.min.y, 'the slats stop short of the bottom of the cords'); + // Cut for the office's windows: 3 m wide, filling the 2.2 m between their sill and head. + const size = blind.getSize(new Vector3()); + assert.ok(near(size.x, 3, 0.05), `${size.x.toFixed(3)} m wide`); + const win = WINDOWS[0]; + assert.ok(Math.abs(blind.min.y - (win.y0 - win.y1)) < 0.25, `it spans the window's ${(win.y1 - win.y0).toFixed(2)} m drop`); +}); + +test('the blotter is a desk pad, thin, and it fits the desk it goes on', () => { + const pad = boundsOf('desk_blotter'); + const size = pad.getSize(new Vector3()); + assert.ok(size.x <= DESK_SIZE.width, `${size.x.toFixed(3)} m is no wider than the desk (${DESK_SIZE.width})`); + assert.ok(size.z <= DESK_SIZE.depth, `${size.z.toFixed(3)} m is no deeper than the desk (${DESK_SIZE.depth})`); + assert.ok(size.y < 0.12, `it is ${size.y.toFixed(3)} m thick, a pad and not a box`); +}); + +test('where noir.ts puts them they stay on the desk, clear of the laptop and the dancing place', () => { + // The desk's own frame, as buildDesk() sets it out: x along it, z out toward the chair. + const half = { x: DESK_SIZE.width / 2 - 0.03, z: DESK_SIZE.depth / 2 - 0.02 }; + // The laptop is 0.78 m wide and stands at 1.3 times (features/workers/laptop.ts), so it takes the + // middle of the top and the noir props have to stay out of it. + const LAPTOP_HALF = (0.78 * 1.3) / 2; + const ON_DESK = [ + ['desk_lamp', { x: -0.88, z: 0.3 }], + ['typewriter', { x: -0.84, z: -0.32 }], + ] as const; + for (const [name, at] of ON_DESK) { + const box = boundsOf(name); + const minX = at.x + box.min.x; + const maxX = at.x + box.max.x; + const minZ = at.z + box.min.z; + const maxZ = at.z + box.max.z; + const where = `${name} runs x ${minX.toFixed(3)} to ${maxX.toFixed(3)}, z ${minZ.toFixed(3)} to ${maxZ.toFixed(3)}`; + assert.ok(minX > -half.x && maxX < half.x, `${where}: on the desk across`); + assert.ok(minZ > -half.z && maxZ < half.z, `${where}: on the desk front to back`); + assert.ok(maxX < -LAPTOP_HALF || minX > LAPTOP_HALF, `${where}: clear of the laptop (which reaches ${LAPTOP_HALF.toFixed(3)})`); + // Whoever dances when a pull request merges stands at (0.72, 0.18), up front. + assert.ok(maxX < 0.72 - 0.25 || minX > 0.72 + 0.25 || maxZ < 0.18 - 0.25 || minZ > 0.18 + 0.25, `${where}: clear of the dancing place`); + } + // The typewriter stands in the back corner its desk's knick-knack leaves free (seats.ts's buildDesk): + // a mug or books at x 0.84 (index % 3 of 0 or 2), a plant at x -0.85 (1). + for (const right of [false, true]) { + const box = boundsOf('typewriter'); + const minX = (right ? 0.84 : -0.84) + box.min.x; + const maxX = (right ? 0.84 : -0.84) + box.max.x; + assert.ok(right ? minX > LAPTOP_HALF : maxX < -LAPTOP_HALF, `the typewriter in the ${right ? 'right' : 'left'} back corner runs x ${minX.toFixed(3)} to ${maxX.toFixed(3)}`); + // Clear of the knick-knack in the other back corner is automatic; what matters is its own side: + // a mug at x 0.85 and books at x 0.84 both reach about 0.13 in, and a plant at x -0.85 about 0.1. + const knick = right ? -1 : 1; + assert.ok(right ? minX > 0.5 : maxX < -0.5, `it is well over on its own side of the desk (${knick > 0 ? 'left' : 'right'})`); + } +}); + +test('the cabinets stand against the walls, back on the wall and inside the room', () => { + const box = boundsOf('filing_cabinet'); + const size = box.getSize(new Vector3()); + const spots = [ + { x: -18 + 0.31, z: -11.8, rotY: Math.PI / 2, wall: 'west' as const }, + { x: -18 + 0.31, z: 8.2, rotY: Math.PI / 2, wall: 'west' as const }, + { x: -18 + 0.31, z: 10.2, rotY: Math.PI / 2, wall: 'west' as const }, + { x: -11.5, z: 13 - 0.31, rotY: Math.PI, wall: 'south' as const }, + { x: -7.1, z: 13 - 0.31, rotY: Math.PI, wall: 'south' as const }, + { x: -6.3, z: 13 - 0.31, rotY: Math.PI, wall: 'south' as const }, + ]; + const WALL_AT = { west: -18, east: 18, south: 13, north: -13 } as const; + // Where the model's own x and z land in the room once it is turned by rotY about y. + const turned = (mx: number, mz: number, r: number): [number, number] => [mx * Math.cos(r) + mz * Math.sin(r), -mx * Math.sin(r) + mz * Math.cos(r)]; + for (const spot of spots) { + const corners = [box.min.x, box.max.x].flatMap((mx) => [box.min.z, box.max.z].map((mz) => turned(mx, mz, spot.rotY))); + const along = corners.map(([dx]) => spot.x + dx); + const across = corners.map(([, dz]) => spot.z + dz); + const wall = WALL_AT[spot.wall]; + const eastWest = spot.wall === 'west' || spot.wall === 'east'; + // The face nearest the wall has to be against it, inside the room and not through it, and the + // brass pulls (its front) have to be on the far side of that, facing into the room. + const near = eastWest ? Math.min(...along) : Math.max(...across); + const far = eastWest ? Math.max(...along) : Math.min(...across); + assert.ok(near >= wall - 1e-3, `at ${spot.wall} its back is inside the room at ${near.toFixed(4)}, not through the wall (${wall})`); + assert.ok(near - wall < 0.06, `at ${spot.wall} it stands ${(near - wall).toFixed(3)} off the wall, close against it`); + assert.ok(Math.abs(far - wall) > Math.abs(near - wall), `at ${spot.wall} its front (the brass pulls) faces into the room`); + // And the whole thing stays inside the room the other way, along the wall. + const span = eastWest ? across : along; + assert.ok(Math.min(...span) > -13.01 && Math.max(...span) < 13.01, `along the wall it runs ${Math.min(...span).toFixed(2)} to ${Math.max(...span).toFixed(2)}`); + } + // Nothing stands in a window: the south windows are at u -14, -9 and 1, the west ones at -9, -3 and 3. + for (const spot of spots) { + const along = spot.wall === 'west' || spot.wall === 'east'; + for (const w of WINDOWS) { + if (w.wall !== spot.wall) continue; + const u = along ? spot.z : spot.x; + assert.ok(Math.abs(u - w.u) > w.width / 2 + 0.3, `a cabinet at ${spot.wall} u ${u.toFixed(2)} is clear of the window at u ${w.u}`); + } + } + // Nor across a way out of the room, or in front of the ladder up the west wall. + for (const spot of spots) { + for (const d of [EXIT_DOOR, BALCONY_DOOR]) { + if (d.wall !== spot.wall) continue; + const along = d.wall === 'west' || d.wall === 'east'; + const u = along ? spot.z : spot.x; + assert.ok(Math.abs(u - d.u) > d.width / 2 + 0.4, `a cabinet at ${d.wall} u ${u.toFixed(2)} is clear of the door at u ${d.u}`); + } + if (spot.wall !== 'west') continue; + assert.ok(Math.abs(spot.z - LADDER.z) > LADDER.width / 2 + 0.4, `a cabinet at west z ${spot.z} is clear of the ladder at z ${LADDER.z}`); + } +}); + +test('each piece is cheap: a prop a few thousand triangles at most, the blind under 7000', () => { + for (const name of PIECES) { + const limit = name === 'venetian_blind' ? 7000 : name === 'filing_cabinet' || name === 'typewriter' || name === 'rotary_phone' ? 3200 : 2000; + assert.ok(trianglesOf(name) <= limit, `${name}: ${trianglesOf(name)} triangles (limit ${limit})`); + } +}); \ No newline at end of file