diff --git a/scripts/mascots/butler.py b/scripts/mascots/butler.py index 19e3c8850..17f90a567 100644 --- a/scripts/mascots/butler.py +++ b/scripts/mascots/butler.py @@ -20,7 +20,7 @@ OUT = os.path.join(os.path.dirname(bpy.data.filepath) or os.getcwd(), "") PAINT = { "skin": 0xF8F0E3, "ink": 0x262533, "trouser": 0x2C2B38, "lens": 0x10101C, "navy": 0x282959, "silver": 0xDCD6D8, "blue": 0x5155FF, "indigo": 0x3431B6, "lavender": 0x9B9AFC, "grey": 0xCAC0C5, "lapel": 0x444150, "satin": 0x5E5B6E, "screen": 0x343879, "slate": 0x5B5E80, "lining": 0x2A2670, - "cream": 0xFCF2E5, "jacket": 0x2C2B38, "hoodie": 0x24232E, "joint": 0x2D2C39, "white": 0xFFFFFF, "underplate": 0x4E4D60, "whistle": 0x5A5CF0, + "cream": 0xFCF2E5, "jacket": 0x2C2B38, "hoodie": 0x24232E, "joint": 0x2D2C39, "white": 0xFFFFFF, "underplate": 0x3E3D50, "whistle": 0x5A5CF0, "line": 0x0E0E18, "fold": 0xB4ADCB, } FPS = 24 @@ -406,7 +406,8 @@ def sneakers(prefix, upper="blue", patch="cream"): at, toe = x * LEG_X, -0.36 bone = f"foot_{side}" out += [ - (rounded_box(f"{prefix}_{side}_sole", (0.40, 0.62, 0.11), (at, -0.10, 0.055), "cream", bevel=0.05, segments=6).name, bone), + (rounded_box(f"{prefix}_{side}_tread", (0.40, 0.62, 0.05), (at, -0.10, 0.025), "navy", bevel=0.022, segments=4).name, bone), + (rounded_box(f"{prefix}_{side}_sole", (0.40, 0.62, 0.08), (at, -0.10, 0.075), "cream", bevel=0.035, segments=5).name, bone), line(f"{prefix}_{side}_welt", [(at + x * 0.185 * math.cos(math.radians(t)), -0.10 + 0.295 * math.sin(math.radians(t)), 0.105) for t in range(0, 361, 20)], bone, radius=0.008, closed=True), (rounded_box(f"{prefix}_{side}", (0.37, 0.56, 0.17), (at, -0.08, 0.19), upper, bevel=0.08, segments=6).name, bone), (ball(f"{prefix}_{side}_toe", 0.16, (at, toe + 0.12, 0.14), "cream", scale=(1.15, 0.85, 0.7)).name, bone), @@ -461,7 +462,7 @@ def build_butler_assets(): (ring("collar", 0.20, 0.05, (0, 0.02, CHIN - 0.03), "jacket", scale=(1, 0.95, 0.6)).name, "torso"), ] for side, x in SIDES: - parts.append((tube(f"cuff_{side}", 0.115, 0.08, (x * ARM_X, 0, WRIST - 0.01), "cream").name, f"forearm_{side}")) + parts.append((bare(tube(f"cuff_{side}", 0.125, 0.06, (x * ARM_X, 0, WRIST - 0.01), "cream")).name, f"forearm_{side}")) parts += dress_shoes("dress_shoe") out["butler_coat"] = parts + sleeves("sleeve", "jacket") bow = [] @@ -483,9 +484,8 @@ def build_butler_held(rig): (rounded_box("laptop", (0.48, 0.34, 0.04), top + Vector((0, -0.02, 0.035)), "navy", bevel=0.014).name, "hand_left"), (rounded_box("laptop_screen", (0.54, 0.035, 0.42), top + Vector((0, 0.16, 0.25)), "navy", bevel=0.018, rotation=(-8, 0, 0)).name, "hand_left"), (rounded_box("laptop_glass", (0.47, 0.01, 0.35), top + Vector((0, 0.138, 0.255)), "screen", bevel=0.01, rotation=(-8, 0, 0)).name, "hand_left"), - (bare(slab("laptop_glare", [(-0.20, 0.15), (-0.08, 0.15), (-0.20, 0.03)], 0.005, top + Vector((0, 0.130, 0.255)), "satin", rotation=(-8, 0, 0))).name, "hand_left"), (rounded_box("laptop_lip", (0.54, 0.05, 0.035), top + Vector((0, -0.17, 0.03)), "navy", bevel=0.012).name, "hand_left"), - (tube("laptop_light", 0.115, 0.012, top + Vector((0, 0.128, 0.255)), "blue", rotation=(82, 0, 0)).name, "hand_left"), + (bare(tube("laptop_light", 0.115, 0.012, top + Vector((0, 0.128, 0.255)), "blue", rotation=(82, 0, 0))).name, "hand_left"), (slab("laptop_tick", tick_outline(0.14), 0.012, top + Vector((0, 0.118, 0.255)), "white", rotation=(-8, 0, 0)).name, "hand_left"), ] middle = forearm[0].lerp(forearm[1], 0.15) @@ -507,14 +507,14 @@ def cap(prefix, turn=0.0, backwards=False, peak=34, reach=0.36, brow=0.085): parts = [ (dome(f"{prefix}_crown", radii, (0, 0, 0), "blue", height=brow, tilt=-12 if backwards else 12).name, "head"), (ball(f"{prefix}_button", 0.04, (0, 0, radii[2] * 1.0), "blue").name, "head"), - (slab(f"{prefix}_peak_under", [(0.28 * math.cos(math.radians(a)), -(reach - 0.01) * math.sin(math.radians(a))) for a in range(0, 181, 10)], 0.02, (0, -radii[1] + 0.08, brow + 0.045), "indigo", rotation=(-90 - peak, 0, 0)).name, "head"), - line(f"{prefix}_seam", [(radii[0] * 0.98 * math.cos(math.radians(a)), -radii[1] * 0.98 * math.sin(math.radians(a)), brow + 0.07) for a in range(15, 166, 15)], "head"), + (slab(f"{prefix}_peak_under", [(0.28 * math.cos(math.radians(a)), -(reach - 0.01) * math.sin(math.radians(a))) for a in range(0, 181, 10)], 0.02, (0, -radii[1] + 0.08, brow + 0.040), "indigo", rotation=(-90 - peak, 0, 0)).name, "head"), + line(f"{prefix}_seam", [(radii[0] * 1.01 * math.cos(math.radians(a)), -radii[1] * 1.01 * math.sin(math.radians(a)), brow + 0.075) for a in range(15, 166, 15)], "head"), (slab(f"{prefix}_peak", [(0.29 * math.cos(math.radians(a)), -reach * math.sin(math.radians(a))) for a in range(0, 181, 10)], 0.04, (0, -radii[1] + 0.08, brow + 0.065), "blue", rotation=(-90 - peak, 0, 0), bevel=0.015).name, "head"), ] if backwards: parts += [ - (slab(f"{prefix}_opening", rounded_outline(0.24, 0.15, 0.06), 0.03, (0, 0.30, 0.30), "lens", rotation=(-50, 0, 180)).name, "head"), - (slab(f"{prefix}_strap", rounded_outline(0.28, 0.05, 0.02), 0.025, (0, 0.35, 0.21), "blue", rotation=(-40, 0, 180), bevel=0.008).name, "head"), + (slab(f"{prefix}_opening", rounded_outline(0.26, 0.14, 0.06), 0.03, (0, 0.37, 0.12), "lens", rotation=(-20, 0, 180)).name, "head"), + (slab(f"{prefix}_strap", rounded_outline(0.30, 0.05, 0.02), 0.025, (0, 0.395, 0.04), "blue", rotation=(-15, 0, 180), bevel=0.008).name, "head"), ] return placed(parts, Matrix.Translation(HEAD_AT) @ turn) @@ -617,7 +617,7 @@ def mitten(prefix, rig, side, grip, toward=None): if grip == "fist": thumb(c + a * 0.12 + n * 0.02, c + a * 0.04 + n * 0.16) else: - thumb(c + a * 0.11, c + a * 0.11 + Vector((0, 0, 0.30))) + thumb(c + a * 0.05 + n * 0.06, c + a * 0.05 + n * 0.06 + Vector((0, 0, 0.19))) hollow = c + n * 0.12 + d * 0.05 elif grip == "edge": for k, o in enumerate(FINGERS): @@ -664,7 +664,7 @@ def build_colleague_assets(): glint, turn = on_head(centre + lens * 0.3, HEAD_AT.z + middle + tall * 0.25, 0.05) glasses.append((bare(slab("colleague_glint", rounded_outline(0.02, 0.065, 0.008), 0.01, glint, "white", rotation=(0, 35, turn[2]))).name, "head")) glasses.append((rounded_box("colleague_seam", (0.07, 0.05, 0.12), on_head(0.03, HEAD_AT.z + 0.29, 0.0)[0], "lens", bevel=0.02, rotation=(-50, 0, 0)).name, "head")) - return {"colleague_shirt": shirt + sneakers("colleague_shoe"), "colleague_glasses": glasses} + return {"colleague_shirt": shirt + sneakers("colleague_shoe", upper="cream", patch="blue"), "colleague_glasses": glasses} def build_colleague_held(rig): @@ -673,19 +673,19 @@ def build_colleague_held(rig): out = Vector((n.x, n.y, 0)).normalized() return {"colleague_mug": [ (tube("colleague_mug", MUG, 0.24, mug, "navy").name, "hand_left"), - (tube("colleague_coffee", MUG - 0.015, 0.01, mug + Vector((0, 0, 0.115)), "lapel").name, "hand_left"), + (bare(tube("colleague_coffee", MUG - 0.02, 0.012, mug + Vector((0, 0, 0.124)), "lapel")).name, "hand_left"), (ring("colleague_mug_handle", 0.065, 0.022, mug + out * (MUG + 0.05), "navy", rotation=(90, 0, math.degrees(math.atan2(out.y, out.x)))).name, "hand_left"), ] + wrap + rest} def build_homie_assets(): hoodie = jacket("homie_hoodie", "hoodie", size=(0.92, 0.56, 0.66), sleeve=0.15) - hoodie.append((ring("homie_hood", 0.29, 0.11, (0, 0.06, CHIN - 0.02), "hoodie", rotation=(-12, 0, 0), scale=(1, 0.9, 0.75)).name, "torso")) + hoodie.append((ring("homie_hood", 0.33, 0.12, (0, 0.04, CHIN + 0.0), "hoodie", rotation=(-10, 0, 0), scale=(1.1, 1.0, 0.7)).name, "torso")) hoodie += [line(f"homie_knee_fold_{side}", front_arc((x * LEG_X, 0, KNEE + 0.02), 0.153, 100, droop=0.035), f"thigh_{side}") for side, x in SIDES] front = -0.252 hoodie.append(line("homie_pocket", [(-0.16, front, 0.88), (-0.11, front, 1.04), (0.11, front, 1.04), (0.16, front, 0.88)], "torso")) hoodie.append(line("homie_hem", [(-0.16, front, WAIST + 0.06), (0.16, front, WAIST + 0.06)], "torso")) - hoodie += [(hanging(capsule(f"homie_string_{side}", 0.014, (x * 0.07, -0.25, CHIN - 0.07), (x * 0.085, -0.262, CHIN - 0.30), "cream"), 1.0).name, "torso") for side, x in SIDES] + hoodie += [(hanging(capsule(f"homie_string_{side}", 0.014, (x * 0.08, -0.30, CHIN - 0.08), (x * 0.09, -0.305, CHIN - 0.32), "cream"), 1.0).name, "torso") for side, x in SIDES] neck = [] for side, x in SIDES: neck += [ @@ -694,7 +694,7 @@ def build_homie_assets(): (tube(f"homie_phone_{side}_disc", 0.075, 0.02, (x * 0.24, -0.245, CHIN - 0.04), "blue", rotation=(90, 0, -30 * x)).name, "torso"), ] neck.append((sweep("homie_phone_band", through([(-0.22, -0.20, CHIN - 0.04), (-0.10, -0.27, CHIN - 0.12), (0.10, -0.27, CHIN - 0.12), (0.22, -0.20, CHIN - 0.04)], 10), [0.022] * 10, "lavender", sides=10).name, "torso")) - return {"homie_cap": cap("homie_cap", turn=30, backwards=True, peak=-22, brow=0.15), "homie_hoodie": hoodie + sneakers("homie_shoe"), "homie_headphones": neck} + return {"homie_cap": cap("homie_cap", turn=30, backwards=True, peak=6, brow=0.15), "homie_hoodie": hoodie + sneakers("homie_shoe"), "homie_headphones": neck} # The squire wears a helmet over his own head: a taller shell with an opening for the visor, a crest, a slot on the brow and a plume. @@ -721,7 +721,7 @@ def build_squire_assets(): helmet.append((hanging(sweep(f"squire_plume_{k}", lock, thickness, "blue" if k != 1 else "indigo", flat=0.55, up=(0, 0, 1)), 0.25, lock[0], lock[-1]).name, "head")) armour = [ (rounded_box("squire_plate", (0.62, 0.44, 0.62), (0, 0, (WAIST + CHIN) / 2 - 0.03), "skin", bevel=0.19, segments=8).name, "torso"), - (ring("squire_gorget", 0.19, 0.045, (0, -0.01, CHIN - 0.13), "underplate", scale=(1, 0.9, 0.6)).name, "torso"), + (ring("squire_gorget", 0.22, 0.055, (0, 0.0, CHIN - 0.06), "underplate", scale=(1.15, 0.95, 0.6)).name, "torso"), (ring("squire_scarf", 0.22, 0.08, (0, -0.03, CHIN - 0.04), "blue", rotation=(10, 0, 0), scale=(1, 0.95, 0.7)).name, "torso"), (hanging(slab("squire_scarf_tail", [(0, 0), (0.18, -0.02), (0.06, -0.22)], 0.04, (0.04, -0.24, CHIN - 0.06), "blue", bevel=0.01), 1.0).name, "torso"), (rounded_box("squire_belt", (0.64, 0.46, 0.08), (0, 0, WAIST + 0.02), "joint", bevel=0.03).name, "torso"), @@ -734,7 +734,7 @@ def build_squire_assets(): leg = leg_joints(x) armour += [ (ball(f"squire_pauldron_{side}", 0.15, (x * (ARM_X + 0.02), 0, SHOULDER + 0.04), "skin", scale=(1, 1, 0.8)).name, "torso"), - (ring(f"squire_pauldron_{side}_under", 0.145, 0.04, (x * (ARM_X + 0.02), 0, SHOULDER - 0.05), "underplate").name, "torso"), + (ball(f"squire_pauldron_{side}_under", 0.165, (x * (ARM_X + 0.03), 0, SHOULDER - 0.03), "underplate", scale=(1, 1, 0.55)).name, "torso"), ] + [ (ring(f"squire_vambrace_{side}_{k}", 0.088, 0.016, (x * ARM_X, 0, ELBOW - 0.07 - 0.08 * k), "underplate").name, f"forearm_{side}") for k in range(3) ] + [