generate_scene.py 从 1271 → 816 行 (-455)
P0: 纯函数搬家
- osmassets/osm.py: parse_osm / Projector / parse_height
- osmassets/geom.py: clip_polygon / point_in_polygon / distance_to_ring / sample_tree_row 等
- blender/tests/test_pure.py: 42 个 unittest (脱离 bpy 运行)
P1: 单一定义源
- osmassets/catalog.py: ROAD_LAYERS + MATERIALS (含 cesium 导出参数)
- 对接 osm2streets_scene_style.json 做图层一致性 warning
- 干掉 road_mats / layer_z / 材质参数三份副本
P2: 要素注册表
- osmassets/{water,grass,scrub}.py: 每个要素一个 assemble() 函数
- build() 中的 if/elif 链收缩为注册表调用
- 计数器集中到 counts 字典
P3: 材质契约化
- catalog.py 扩展 CESIUM_EXPORT 段 (tint/metallic/emission)
- 标记已发现的死条目 Office White Metal Facade (四表各一组)
校验:
- parity.js + scene_digest.py + glb-digest.js 三位一体
- control-1 vs p0/p1/p2a/p2b/p3-counts: 两区域全 PARITY OK
- 42 个纯 Python 测试全部通过
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
13 lines
531 B
Python
13 lines
531 B
Python
"""Reusable pieces of the OSM → Blender/Cesium asset pipeline.
|
|
|
|
The package is split by dependency, not by feature:
|
|
|
|
- `osm` and `geom` are pure Python. They import no `bpy` and can be run and
|
|
tested with a plain interpreter (`python3 -m unittest discover blender/tests`).
|
|
- everything else may touch `bpy` and only runs inside Blender.
|
|
|
|
Keeping that line sharp is what makes the geometry testable at all; before the
|
|
split it was interleaved with scene construction and could only be exercised by
|
|
rendering a whole area.
|
|
"""
|