Hackathon Proposal: WS3.0 Effects

From FlightGear wiki
Jump to navigation Jump to search

Title: WS 3.0 Effects

Edinburgh rendering using WS3.0.jpg
Sponsors: Stuart
Interested Parties: merspieler
Status: n/a
Summary: n/a
Background: Currently we have some of the pieces required for WS3.0:
  • We can generate the underlying LOD mesh with a texture draped over it.
  • We can dynamically generate airports
  • We can load the scenery in FG.

... but the WS3.0 scenery in FG is basically a dark gray blob. The bit that's missing is having the scenery pick up material definitions and therefore Effects and shaders.

This hackathon idea is to apply material definitions to that scenery and perhaps develop a shader that will use the landclass texture to generate some plausible texturing.

Details: n/a
Required skills: C++
Learning Opportunities: * Materials
  • Effects
  • OSG and Virtual Planet Builder

Useful resources:

Adding Trees

Details of sub-project to add trees to WS3.0.


  • FG has the concept of a Material - how a particular type of land (a landclass) is rendered by the simulator (e.g. texture, Effect, tree density, roughness).
    • The materials are defined in a set of XML files in fgdata/Materials. Different regions (defined by lon/lat) can define different materials. So a forest in Norway contains different trees than one in Brazil.
    • See fgdata/Docs/README.materials for the XML format information
    • See Howto:Editing tile textures and materials
    • See Materials/default/global-summer.xml for a good rundown of the different landclasses.
  • The materials are built into a SGMaterialLibrary (simgear/simgear/scene/material/matlib.cxx).
  • In the old scenery, the terrain consists of a triangular mesh that describes both the shape (elevation) of the terrain and the landclass of the terrain. Each triangle of the terrain mesh as a single landclass (e.g. "EvergreenBroadCover").
  • In the WS3.0 scenery, the terrain mesh only contains shape (elevation) information. The landclass of the terrain is provided by the texture. Each triangle can contain bits of multiple landclasses.

How Trees are grown - old scenery

Trees are generated in the Old scenery as follows:

  1. simgear/simgear/scene/tgdb/obj.cxx SGLoadBTG(const std::string& path, const simgear::SGReaderWriterOptions* options) loads a "BTG" file.
    1. line 113 created a SGTileDetailsCallback. This is a callback that will generate more detail for the tile when the viewpoint gets within range. This avoid having to create trees for tiles that might be 100km away and which we never get any closer to.
    2. line 118 creates a PagedLOD which will call the FGTileDetailsCallback when the viewer gets within range.
  2. simgear/simgear/scene/tgdb/SGTileDetailsCallback.hxx readNode(const std::string&, const osgDB::Options*) does the actual work to generate the details for a tile such as forests, random objects, lights, and it called by the PagedLOD object above.
    1. line 138 calls generateRandomTileObjects to create the forest, buildings and buildings
    2. generateRandomTileObjects (line 976) builds a set of OSG nodes and makes various calls to generate the random features.
      1. line 1086 calls computeRandomForest to create a list of the random trees based on the terrain triangles and their landclasses. computeRa
      2. computeRandomForest considers each terrain triangle in turn and...
        1. looks up the landclass in the materials library to determine if this landclass (and therefore triangle) contains any trees
        2. assuming it does, gets a TreeBin to put these trees (based on having the same settings as an existing tree definitions), then
        3. generates a series of random points across the triangle, each of which will be rendered into a tree.
      3. line 1089 converts that intermediate datastructure into the OSG code to actually render the trees.