|IMPORTANT: Some, and possibly most, of the features/ideas discussed below are likely to be affected, and possibly even deprecated, by the ongoing work on deprecating TerraGear favor of VPB (Virtual Terrain Builder). Please see: Post FlightGear 2020.2 LTS changes for further information
You are advised not to start working on anything directly related to this without first discussing/coordinating your ideas with other FlightGear contributors using the FlightGear developers mailing list. talk page.
|Scenery Core Development|
World Scenery 2.0 has been released. After 2 1/2 years of development, the tool-chain is considered stable. Although WS2.0 will continue to receive updates, and bug fixes, I'd like to start planning for the next major overhaul.
For World Scenery 3.0, flightgear will have a LOD system for the underlying mesh. The good news is, this new system is already in simgear (thanks to Mathias), and has been tested with 'hand stitched' .btg files. So our job, is to update the tools to be able to generate the scenery automatically.
Ideally, we would like to have at least 4 levels of detail.
The highest detail level being identical to WS2.0.
The second level of detail maintains the same elevation mesh, but removes line data from both airports and terrain. Airports are still smoothed, and cut in to the terrain.
The third level of detail is a simplified mesh, with simplified airports (no bezier interpolation) created as landclass polys (runway, taxiway, and grass). To be determined, is how to simplify the landclass polygons. possibly combining a small area landclass with it's neighbor.
Optional fourth level and more LODs would be refinements to the third - lower res mesh, and more landclass combining)
The lowest detail level being a sphere with a global texture.
In the terragear toolchain, there are 3 main directories: Data, Work, and Output. The Work directory structure will be overhauled to handle arbitrary tile sizes. The output directory needs to match what simgear .SPT files expect.
After conversing with i4dnf, some extra ideas have come up to fix some of the long standing scenery issues. As we move to a new scenery structure, that may not be 100% backward compatible, we should be able to add some additional capabilities to the .btg file format. NOTE: the .btg file format is extensible, so this may not require major changes and 'could' be backward compatible. Experimentation needed:
The first idea is separating the runway markings from the pavement. We have this somewhat working now, but the pavement shader is completely clueless about the marking shader. and bump mapping / dirtying effects cannot be normalized between the line and pavement - leading to visual artifacts. The marking shader needs to know the underlying pavement origin. To do this, the .BTG file needs to support multiple texture coordinates. 1 primary set to look up the line texture in the texture atlas, and another set relative to the origin of the pavement. i4dnf would also like to add dirty / tire marks to the runways. To do this, he needs to know where in the runway polygon, the thresholds are. In openGL, a vertex attribute would be passed to the shader to relay the information. The btg format should be expanded to allow vertex indices (of a triagle) to have attributes.
The second idea is to use multiple tcs to allow landclass shaders to know where in a tile they are located. If we have a per tile raster image with the landclasses encoded, then the borders between landclasses can be smoothed / modified by the shaders. We could also encode regional definitions into the same raster image to support irregular shaped region encoding. probably 8 bits for landclass, and 8 bits for region is enough.
It would be nice to have all landclass images and this single per tile image to all have the same resolution, so we could use a texture array. This allows us to draw an entire tile (other than linear road / rail / stream ) in one openGL draw call.
The below table is my first attempt at a work item breakdown. I imagine we'll need to add / remove entries as work progresses.
arbitrary tile sizes for ogrdecode and tgconstruct is no longer needed. Going forward, we will try to simplify generated BTGs instead of creating new ones based on simplified scenery.
- A fairly large snag while developing secondary texture coordinates : tc scaling is done per material, and the scaling needs to be looked up by material name. Currently, the btg file stores lists of triangles/strips/fans under a common material name. A draped material may lie on multiple underlying materials. In the short term, my plan is to ignore texture coordinate scaling. The main use case for this is the linear features over airport pavements and runways. A quick check shows that these materials do not use tc scaling, so we should be ok. If we get to the point where we drape roadways over general terrain, however, we will need a real solution.
- Linear feature intersections are working, and committed to terragear/master. I'll post screenshots, and details of the algorithm shortly.
- I want to refactor simgear/scene/tgdb/obj.cxx. Currently, it is saving most of the .btg in an inefficient format, along side the scenegraph equivelent, before building trees, lights, and random buildings. I am creating a new page here for discussion among interested parties: NewBTGLoader
I'm getting close to a merge request for simgear changes so we can add bump maps and 'dirty maps' (i.e. skid marks) to the runways and taxiways that allow the same map to be used on both the draped details, and the pavement.
Runtime Airport Generation
For now, please see the following discussions to learn more about plans to procedurally build airports at run-time:
- Scenery Draping
- Airport Runtime Generation-1
- Airport Runtime Generation-2
- Airport Runtime Generation-3
- Airport Runtime Generation-4
- Airport Runtime Generation-5