作个总结,方便代码阅读:
1. 代码入口TerrainSceneManager::setWorldGeometry(), 此函数主要有2个重要任务:a、根据Terrain.cfg加载地型配置信息,b、加载高度图数据。
2. 初始化分级索引缓冲 initLevelIndexes()
3. calculateWorldRange --------------> 调用 resize(AABB) 重新计算世界范围
4. 设置分页材质 HeightmapTerrainPageSource::setupTerrainMaterial 取代 TerrainSceneMgr::setTerrainMaterial , 因为这里使用PagedGeometry来管理超大地型, 分页加载
等,故每页可以有自己的材质
5. setupTerrainPages 设置地型分页
6. _firePreRequestPage()
mActivePageSource->requestPage() [重点]
_firePostRequestPage()
7. 细分 requestPage()
a、读取HeightData
b、firePageConstructed()
c、核心: buildPage()
1. 首先构建真正的TerrainPage
2. 构建场景结点容纳新的Page
3. 根据新的Page及TileSize构建Tile(也就是渲染数据TerrainRenderable) 我的配置是: PageSize 128 x 128 TileSize 64 x 64
a. 子结点挂Tile b. setMaterial c. page->tiles[p][q] = tile 关联Page d. node->attachObject(tile) 关联场景结点
8. 加载地型页挂载的其它静态物件(如:树、草、水等) Page->loadPageMovable()