CityShip — a city exports as one giant file, so I made it split into zones that snap back together

https://youtu.be/JFRyPxMyG6Q

I kept hitting the same wall taking OSM cities from Blender into a game, so I wrote a tool for it. Sharing it here with two things I measured along the way, in case they are useful even if the addon is not.

**The wall**

A city exports as one big file. The player stands on one corner and the whole city is in memory. Split it by hand and the pieces stack on the origin, because nothing remembers where it was. And you cannot tell how heavy it is until the engine tells you.

**Two things I found**

1. Blosm’s “Single object” is ON by default, which merges the whole city into one mesh. Nothing can split that afterwards. I imported 810 buildings and got 3 objects, with 99% of the triangles in one of them — and no error anywhere. If you are exporting Blosm cities to an engine, that checkbox is probably the first thing to turn off.

2. `bpy.ops.uv.cube_project` aligns to each object’s bounding box centre, not to world space. Tiles then do not line up between adjacent objects, and the UVs shift whenever you rebuild the mesh. Projecting walls along their own normal instead, with V locked to world height, took my texel-density outliers from 28 (worst -18.6%) to 0.

**The addon**

CityShip sorts objects into zones and exports one file per zone. The part I cared about: every file keeps its world coordinates. Load them all at (0,0,0) with no rotation and no scale and the city assembles itself — no offsets to type in. Verified per object to 0.0000 m, in glTF and FBX.

It also reports triangles, draw calls and size against a platform budget before you export, and tells you when something in the scene is blocking the split.

Central Seoul, 813 buildings from OSM: 25 zones, 12,589 tris, 1.45 MB as glTF+Draco. Under a minute — that is the whole video above, unedited.

Sizing zones by triangle count alone was not enough, by the way. A 941 m city came out as ONE zone because it was only ~10k triangles, which is what low-poly city importers give you. Zone extent has to be a criterion too — 250 m is a reasonable streaming granularity for a walking game.

**What it does not do:** no OSM import (Blosm already does that well), no mesh cutting, no LODs, no texture generation. It works on any city already in your scene, not just Blosm output.

Blender 3.6–5.x. Exports glTF/GLB and FBX. $29: https://seopjjang.gumroad.com/l/cityship

Happy to answer questions about the zoning or the UV projection either way.