UO Renaissance objects (statics and items)
The catalog of world objects to bake as sprites: housing pieces, furniture, lights, crafting stations, decoration, dungeon and civic props, nature, and items lying on the ground. It covers what a player saw in Britannia around the Renaissance release (2000): pre-made houses and keeps, towns, dungeons, the Lost Lands. It is our own modelling of those object types (no UO art is used). The ground terrain is in uo-base-tiles.md.
Every object is a procedural Blender script baked by uo-baker (format:
sprite-format.md, pipeline: asset-pipeline.md).
Each group owns a manifest file assets/manifest.d/<group>.toml and a script
folder tools/blender/models/<group>/; shared helpers are in
tools/blender/models/object_kit.py. Review with
python3 tools/gallery.py --group assets/manifest.d/<group>.toml -o sheet.png.
Conventions
- Scale (1 unit = 1 tile): human 1.8, wall 2.12 (48 px storey), door 1.89 (42 px), chair seat 0.45 / back 1.0, table top 0.77 (level 17), counter 1.0 (level 22), bed top 0.5, bookcase/armoire 2.0, barrel 0.9, chest 0.5, candle 0.15.
- Facings: objects with a front bake
directions = 4(frames North, East, South, West; the model is built facing south, −Y). UO had separate art per facing; the client picks the frame. Wall-mounted items (paintings, sconces, shelves) are built against the north edge facing south: the South frame hangs on a north (x) wall, the East frame on a west (y) wall. - Walls and fences follow the wall convention (decision #16, #22): a piece
sits inside its tile, flush with the north edge (
_x, runs east–west) or the west edge (_y), corners/posts at the north-west corner; origin at the tile centre. - Multi-tile objects: origin at the centre of the north-west-most tile,
the object extends east (+X) and south (−Y); manifest
footprint = [w, h]. Multi-tile objects with a front (marked 4 below with a footprint) are baked as two assets instead of four facings,<name>_sand<name>_e(front south / east, footprints[w, h]/[h, w]), as UO did. - Pixel art: every model sits on the texel lattice (
pixel_kit.py, decision #60, rules indocs/asset-pipeline.md). Silhouettes bold, details whole texels, colour contrast over fine geometry; muted, warm UO palette (object_kit.PALETTE).
Legend: 4 = 4 facings; WxH = footprint; p: = one script, assets
selected by params.
Wave 1
walls — housing wall sets (wall_<material>_<piece>)
One script per material (tools/blender/models/walls/wallset_<material>.py),
the piece picked by params = { piece = "..." }. Pieces: x, y, corner,
post, window_x, window_y, doorway_x, doorway_y (doorway = opening
for a door sprite, 12 texels wide × 42 levels high). Height 48 levels (one
storey, 2.12 units), 2 texels thick.
The full sets (all but cave and palisade) also have the pieces the building
generator (crates/uo-buildings, #101) orders in assets/requests/wall-pieces.md,
built by walls_kit from each set's own wall and post code (decision #102):
diag_a(/, north-east to south-west: a camera-facing horizontal run) anddiag_b(\, edge-on), plus_windowvariants: full height, run between the corner posts of the wall grid (1 texel inside the north and west tile edges), so they meet the straight walls and posts of a cut corner exactly; the frame is sheared (2 texels thick along Y, ends on X planes), so it stays on the lattice and joins the next diagonal tile. Window u -3..3 (8.5 texels along the slant). They block their tile, no edge. Their outlines sit on half-pixel rows and stay softer than straight walls.low_x,low_y,low_corner,low_post: parapets of balconies and terraces, the set's wall cut at level 16 under a 2-level coping (posts cap one level higher).slit_x,slit_y: an arrow slit 2 texels wide at levels 22..36 through the back half of the wall, splayed one texel and one level on the front half.crenel_x,crenel_y,crenel_corner,crenel_post: tower-top parapets, solid to 10 under a string course to 12, merlons 12..22 capped to 24, 4 texels merlon and 4 gap (x runs at u -8..-4 and 0..4, y runs mirrored), so both runs have a merlon at the north-west corner and the corner piece an L-shaped corner merlon; posts are merlons.
| Material | Look (UO houses / places) | Pieces |
|---|---|---|
| stone | grey cut ashlar blocks (stone house, tower, keep, castle) | all 22 |
| brick | red brick with mortar, stone sill/lintel (brick house) | all 22 |
| wood | vertical/horizontal planks on a frame (wooden house, shops) | all 22 |
| log | stacked round logs with notched corners (log cabin) | all 22 |
| plaster | white plaster with dark timber framing (two-story plaster, Tudor) | all 22 |
| sandstone | tan sandstone blocks (sandstone patio house, desert towns) | all 22 |
| marble | polished white marble, pilasters (villa, Nujel'm palace) | all 22 |
| fieldstone | rough round fieldstones in mortar (fieldstone house, farms) | all 22 |
| dungeon | dark rough-cut dungeon masonry, mossy base | all 22 |
| cave | natural rock wall, irregular top (caves, mines) | x, y, corner, post |
| palisade | sharpened upright logs (orc forts, camps) | x, y, corner, post, doorway_x, doorway_y |
doors_fences — doors, gates, fences
| Sprite | Notes |
|---|---|
door_<kind>_<axis>_<state> | p: kind ∈ wood, wood_iron (iron bands), dark, light (pale wood), metal, barred (iron bars), secret (stone, flush with a stone wall); axis x/y (in an x / y doorway); state closed/open (open = swung 90° inward on its hinge) |
gate_<kind>_<axis>_<state> | p: kind ∈ wood (fence gate), iron (wrought iron gate) |
fence_<kind>_<piece> | p: kind ∈ wood (split rail), picket (white pickets), iron (wrought iron), stone (low dry-stone wall ~0.8), hedge (clipped box hedge ~1.1), rope (posts and rope); piece ∈ x, y, corner, post |
furniture
| Sprite | Notes | Sprite | Notes | |
|---|---|---|---|---|
chair_wood | 4, plain ladder-back | armoire | 4, tall wardrobe, two doors | |
chair_fancy | 4, padded seat and back, carved | armoire_fancy | 4, dark wood, carved crown | |
chair_straw | 4, rush seat, rustic | dresser | 4, chest of drawers | |
throne | 4, high back, red cushion, gilt | bookcase_full | 4, rows of coloured books | |
stool | three-legged | bookcase_empty | 4 | |
footstool | low padded | shelf_wall | 4, wall shelf with jars/pottery | |
bench_wood | 4, plain bench | nightstand | 4 | |
bench_fancy | 4, backrest bench | chest_wood | 4, iron-bound wooden chest | |
table_small | square side table | chest_metal | 4, metal chest with rivets | |
table_writing | 4, desk with ink and paper | chest_fancy | 4, gilt treasure chest | |
table_long | 4, 2x1, plain long table | strongbox | small iron box | |
table_large | 2x2 heavy dining table | box_wood | small wooden box | |
table_round | round pedestal table | crate_small | small crate (crate exists) | |
counter | 4, shop/bar counter | barrel | closed barrel | |
bed_small | 4, 1x2, single bed | barrel_open | open barrel with water | |
bed_large | 4, 2x2, double bed, canopy posts | keg | barrel on its side on a cradle | |
bedroll | 4, rolled-out bedroll | basket | wicker basket | |
dressform | 4, tailor's dummy | basket_round | round basket with apples | |
screen | 4, folding screen | cradle | 4 |
lights_crafting — light sources and crafting stations
| Sprite | Notes | Sprite | Notes | |
|---|---|---|---|---|
candle | single lit candle (emissive) | forge | stone forge with glowing coals | |
candles | cluster of candles | forge_large | 4, 2x1 | |
candlestick | table candlestick | anvil | 4 | |
candelabra | 3-arm table candelabra | loom | 4, with cloth on it | |
candelabra_stand | tall standing candelabra | spinning_wheel | 4 | |
lamp_post | street lamp post with glass lantern | flour_mill | 2x2, millstone and sacks | |
lantern | lantern on the ground | oven | 4, stone oven/hearth | |
lantern_wall | 4, lantern on a wall bracket | water_trough | 4, 2x1 | |
sconce_wall | 4, candle sconce | scale | merchant scales | |
torch_wall | 4, wall torch | dye_tub | tub of dye | |
torch_standing | torch on a pole | cooking_pot | pot on a tripod over a fire | |
brazier_tall | tall iron brazier | hide_stretcher | 4, hide on a frame | |
campfire | logs, flames, stone ring | training_dummy | 4 | |
fireplace_stone | 4, 2x1, stone fireplace | archery_butte | 4, straw target | |
fireplace_brick | 4, 2x1 | pickpocket_dip | 4, dummy with a pouch | |
sawhorse | 4, carpentry sawhorse with a plank |
decor_home — household decoration
| Sprite | Notes | Sprite | Notes | |
|---|---|---|---|---|
rug_red | 1x1 patterned rug | globe | globe on a stand | |
rug_blue_large | 2x2 | hourglass | ||
rug_fur | bear-skin rug, life size (2 x 2 tiles, ≈ 2.2 m, #83) | books | pile of books | |
painting_portrait | 4, wall | lectern | 4, open book on a stand | |
painting_landscape | 4, wall | scrolls | pile of scrolls | |
tapestry | 4, wall hanging | goblets | goblets and a jug | |
banner | 4, heraldic wall banner | dinner_set | plates of food | |
statue_small | figure on a pedestal | kettle | ||
statue_large | 1x1, life-size human statue | wine_rack | 4, wall rack with bottles | |
bust | bust on a column | bottles | group of bottles | |
vase | flour_sack | |||
urn | large amphora/urn | sacks | pile of grain sacks | |
pottery | jars and pots | wheat_sheaf | ||
potted_plant | hay_bale | |||
potted_flowers | pitcher_bowl | water pitcher and bowl | ||
flower_vase | birdcage | on a stand | ||
harp | standing harp | lute | lute leaning | |
drum | chess_table | 4, table with a chessboard |
civic_dungeon — town, graveyard, dungeon and magic
| Sprite | Notes | Sprite | Notes | |
|---|---|---|---|---|
well | stone well with roof and bucket | chains_wall | 4, shackles on a wall | |
fountain | 2x2 stone fountain with water | iron_maiden | 4 | |
signpost | 4, crossroads signpost | guillotine | 4 | |
shop_sign | 4, hanging sign on a bracket | stocks | 4 | |
gravestone_cross | gallows | 4, 2x1 | ||
gravestone_round | moongate | blue emissive gate | ||
gravestone_obelisk | moongate_red | red (Felucca) | ||
coffin | 4, closed | teleporter | glowing floor glyph | |
coffin_open | 4, with skeleton | stalagmite | ||
sarcophagus | 4 | crystals | emissive crystal cluster | |
altar | 4, stone altar with cloth | mine_cart | 4, with ore | |
pentagram | 3x3 floor pentagram | mine_rails | p: x/y rail piece | |
ankh_shrine | 4, 2x1, large ankh (virtue shrine) | tent | 2x2 canvas tent | |
bone_pile | market_stall | 4, 2x1, awning | ||
skeleton | lying skeleton | cobweb | 4, corner web | |
skulls | pile of skulls | gibbet | 4, hanging cage |
nature — trees, plants, rocks
Trees, bushes, shrubs, ferns, tall grass, flowers, mushrooms and the single
rocks are built from the Quaternius CC0 nature packs (decision #74):
tools/blender/models/nature/packs.py imports the converted models in
assets/models/nature/ (one pack model per variant, the client picks one per
tile), scales them to real size (1 unit = 1 m: grown trees 10-17 m, apple
6.5-8, sapling 3.5-4.5), cuts them at the ground and recolours the leaf cards
per species. tree_willow adds hanging leaf-card curtains to a pack crown.
rocks (cluster), mushroom_giant, cacti, reeds, vines, lily pads, stump and
logs stay procedural (plants.py, rocks.py; the procedural trees.py is
retired). Trees keep footprint = [1, 1] (the trunk's tile). Every tree with
leaves (all but tree_dead) has bare = true: its bare twin in bare/ is the
same variant without leaves and fruit, which the client shows while the crown
is hidden near the player (decision #98).
| Sprite | Notes | Sprite | Notes | |
|---|---|---|---|---|
tree_oak | broad crown | bush | round bush | |
tree_ash | bush_flowering | |||
tree_birch | white bark | shrub | small | |
tree_walnut | fern | |||
tree_willow | drooping | grass_tall | tuft of tall grass | |
tree_cedar | layered conifer | flowers_red | ||
tree_pine | tall conifer | flowers_white | ||
tree_yew | dark, dense | flowers_yellow | ||
tree_palm | mushrooms | cluster | ||
tree_jungle | buttress roots, broad leaves | mushroom_giant | dungeon giant mushroom | |
tree_dead | bare branches | cactus_saguaro | ||
tree_apple | fruit tree | cactus_barrel | ||
tree_cypress | narrow | cactus_prickly | prickly pear | |
tree_sapling | young tree | reeds | ||
rock_small | vines | 4, wall vines | ||
rock_medium | lilypads | on water (flat) | ||
boulder | stump | |||
rocks | cluster | log_fallen | 4, 2x1 |
items_gear — weapons, armour, tools (lying on the ground)
Small items lying flat or propped; read at 32 px by silhouette and colour.
sword_long, sword_broad, katana, dagger, axe_battle, axe_double,
mace, war_hammer, spear, halberd, quarterstaff, bow, crossbow,
shield_heater, shield_buckler, armor_plate, helm_plate, armor_chain,
pickaxe, shovel, hatchet, saw, smith_hammer, tongs, fishing_pole,
sewing_kit, scissors, pitchfork, scythe, mortar_pestle, skillet,
backpack, pouch.
Wave 2
items_goods — resources, reagents, potions, food
ingots (p: iron, copper, gold, silver), ore_pile, logs_pile, boards,
hides, cloth_bolt, gems, gold_coins; reagents reg_black_pearl,
reg_mandrake, reg_garlic, reg_ginseng, reg_nightshade,
reg_spider_silk, reg_sulfurous_ash, reg_blood_moss; potion_<colour>
(p: red, yellow, orange, purple, green, black); food bread, apples,
cheese, ham, fish, pie, wine_bottle, ale_mug, meat_leg, carrots.
roofs_stairs_floors
Roofs roof_<material>_<piece> (p: material ∈ slate, thatch, shingle, tile;
piece ∈ slope_s, slope_n, slope_e, slope_w, ridge_x, ridge_y, corner_se,
corner_sw, corner_ne, corner_nw). Roof contract: a piece's base is at
Z = 0 and the client places it at wall height; slopes rise 32 levels across a
tile (ROOF_COURSE = 32 px ≈ 1.41, a 55° pitch, so course edges draw as 1:1
lines or verticals; slope_s low on the south edge), so each further course of
roof tiles sits 32 px higher; the roof script takes rise for other pitches. Stairs
stairs_<material>_<piece> (p: wood, stone; step_s, step_e, block; one tile
rises 12 levels, four tiles = one 48-level storey); floors
floor_<material> (stone, marble, marble_checker, wood_light, wood_dark,
sandstone, brick, carpet_red, carpet_blue, carpet_gold).
misc_extra — mechanisms, magic, shops, harbour, seasonal
| Sprite | Notes | Sprite | Notes | |
|---|---|---|---|---|
trap_spikes | floor spike trap (raised spikes) | weapon_rack | 4, wall rack with weapons | |
trap_plate | pressure plate | armor_stand | 4, stand with plate armour | |
lever_wall | 4, wall lever | shield_display | 4, wall with crossed swords and shield | |
switch_floor | floor switch | display_case | 4, glass-topped case with goods | |
spellbook_stand | 4, open spellbook on a stand | anchor | ship's anchor lying | |
crystal_ball | on a stand, faint glow | rope_coil | ||
magic_orb | glowing orb on a pedestal | fishing_net | net heaped with floats | |
runebook | rune book lying | dock_planks | p: x/y, plank deck tile | |
rune_stone | recall rune on the ground | dock_post | mooring post | |
alchemy_table | 4, table with flasks and burner | buoy | ||
cauldron | iron cauldron on legs, bubbling (faint glow) | ship_wheel | 4 | |
treasure_pile | heap of gold and gems | christmas_tree | decorated tree | |
gold_ingot_stack | pumpkin | |||
skull_candle | skull with a candle | jack_o_lantern | carved, glowing | |
bell | 4, hanging bell on a frame | snowman | ||
clock | 4, grandfather clock | gift_box | wrapped present |
Status
All groups baked, reviewed in contact sheets and committed on feat/uo-objects
(484 sprites; 610 with the diagonal, low, slit and crenel wall pieces of #102). Review a group with
python3 tools/gallery.py --group assets/manifest.d/<group>.toml -o sheet.png.
| Group | Sprites | Notes |
|---|---|---|
| walls | 208 | 11 materials; diagonals, low walls, slits, crenels for the 9 full sets; doorways meet the doors contract; cave repeats one rock profile per tile (variants later) |
| doors_fences | 60 | door leaves fit the doorways; gates hinge on the fence post (y gates at the north end) |
| furniture | 41 | table_long, bed_small, bed_large as _s/_e |
| lights_crafting | 35 | fireplaces, forge_large, water_trough as _s/_e |
| decor_home | 36 | wine_rack stands against the wall; lute lies flat |
| civic_dungeon | 36 | ankh_shrine, gallows, market_stall as _s/_e; mine_rails_x/y |
| nature | 37 | log_fallen_x/y; giant mushroom spots glow faintly |
| items_gear | 33 | |
| items_goods | 35 | ingots_<metal>, potion_<colour> |
| roofs_stairs_floors | 56 | 10 roof pieces × 4 materials (no separate ridge cap between back-to-back slopes yet) |
| misc_extra | 33 | dock_planks_x/y |
Weakest reads noted in review (candidates for a polish pass): gravestone_cross,
skulls/bone_pile detail, iron_maiden face, cobweb, cactus_prickly,
tree_jungle crown, flour_mill hopper, cheese wedge, ship_wheel,
armor_stand, helm_plate.

In the client
The client places objects as uo_proto::objects::StaticObjects (sprite,
tile, absolute z, facing) on a static layer of impostors; see
docs/rendering.md › Static objects.
Demo village
The offline demo (crates/uo-client/src/village.rs) is a village of 90 x 56
tiles in the middle of a 128 x 128 map that places every object of the
catalog (a test checks it against assets/manifest.d; 2222 statics of 484
sprites):
| Building | Walls | Storeys, roof | Inside |
|---|---|---|---|
| player's home | stone | 1, slate | table set for dinner, fireplace, bed, bookcase; secret back doors |
| tavern | wood | 2, shingle (ridge) | bar with kegs and bottles, tables, musicians; inn rooms above |
| mage tower | marble | 3, tile (ridge) | alchemy lab, study with books and globe, archmage's hall with throne |
| weaver | plaster | 2, thatch (ridge) | loom, spinning wheel, dye tub, dress form; bedroom above |
| bakery | brick | 1, tile (ridge) | ovens, flour mill, sacks, bread and pies |
| gaol | dungeon | 1, slate (ridge) | barred doors, chains, iron maiden, traps, lever |
| smithy | fieldstone | 1, slate | large forge, anvil, armour, ingots; metal doors |
| provisioner | sandstone | 2, shingle (ridge) | counter with scales and coins, display case; strongroom above |
| hunter's cabin | log | 1, thatch (ridge) | fireplace, furs, bedroll, bows; open doorways |
| stockade | palisade | — | training dummies, archery range (rope fence), tents, camp |
| mine | cave | — | rails, mine cart, crystals, stalagmites, giant mushroom |
Around them: cobbled streets and a flagstone plaza (fountain, well, statues,
market stalls, bell, a seasonal corner), a justice square (gallows, stocks,
guillotine, gibbet), a mage garden behind a hedge (pentagram, moongates,
shrines, teleporter), a graveyard behind a wrought-iron fence, a paddock
(split rail), a vegetable patch (pickets), a farm field (dry-stone wall), a
desert garden, an orchard, a pond with a dock and, in the south-east, a
mason's yard with one exhibit per full wall set (crenellated and low corners
with their posts, a \ and a / diagonal run, slits in an x and a y wall). All 28 doors, 8 gates, 6
fence and 11 wall sets, 40 roof pieces (ridges come from roofs with an odd
short side), 6 stair pieces and 10 floors are used.
- Storeys: storey
sstands atz + WALL_HEIGHT · s(48 px each); its floor covers the interior except the stairwell of the flight from below. A flight is four stair tiles (step_sclimbing north orstep_eclimbing west) rising 12 px each, withstairs_*_blockpieces stacked under the higher steps; the top step ends level with the next floor. - Wall rings: corner piece on the north-west tile,
_xalong the north and south rows,_yalong the west and east columns, posts at the other three corners; a window on every wall tile whose offset along the wall is 2 mod 3; doorway pieces (with a door, or open) where the plan says. Fences use the same ring with gates replacing pieces. - Roofs:
uo_proto::objects::hip_roof(material, x, y, w, h, z)gives every tile of awxhbuilding the piece of its nearest outer edges (slopes, hip corners, ridges), one course (+1.0) higher per tile inwards, eaves at the top storey's wall height. With an even short side the roof is a clean hip without ridge pieces; with an odd short side a ridge runs along the middle row (or column) and its end tiles, where three slopes would meet and the set has no piece, leave a small gable. The village uses both. Roofs and upper storeys hide while the player is inside (UO style). - Lights: objects with glowing texels (candles, sconces, braziers, fireplaces, lamp posts, campfires, moongates, crystals) get a point light at their flame automatically; walls (glowing window panes) don't.

Follow-ups
- Open doors swing into the tile they stand on (south for
_x, east for_y), so a door in a building's south or east wall opens outwards. Doors opening the other way need a second open state (e.g.open_out). - The south and east walls stand just outside the roof's tiles (walls sit on the north/west edge of their tile), so their tops show a 0.09-unit ledge below the eaves on the camera side. A roof edge piece or a wider eave overhang on the south and east would hide it.
- A hip-end piece (three slopes) would allow hip roofs with an odd short side; gable-end wall pieces would allow gable roofs.
- Players can't climb stairs yet (walking is 2D on the terrain), so upper
storeys are only seen, not visited;
RoofViewdecides what is drawn. - Statics are client-side only (the demo builds them); the server still has
to own and send them (a
staticslist inWelcomeor per region), and multi-tile blocking should come from the manifestfootprint. - Seasonal or rare variants of statics (e.g. cave walls) could use
variants = Nlike the ground tiles; the client already picks a variant per tile for such sheets.