Hackathon Proposal: WS3.0 Effects: Difference between revisions

 
Line 46: Line 46:
* The materials are built into a SGMaterialLibrary (simgear/simgear/scene/material/matlib.cxx).
* 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 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.
* In the WS3.0 scenery, the terrain mesh only contains shape (elevation) information, and is created at runtime from a heightmap.  The landclass of the terrain is provided by the texture.  Each triangle can contain bits of multiple landclasses.


=== How Trees are grown - old scenery ===
=== How Trees are grown - old scenery ===
Line 63: Line 63:
#### generates a series of random points across the triangle, each of which will be rendered into a tree.
#### generates a series of random points across the triangle, each of which will be rendered into a tree.
### line 1089 converts that intermediate datastructure into the OSG code to actually render the trees.
### line 1089 converts that intermediate datastructure into the OSG code to actually render the trees.
=== How to grow trees in WS3.0 ===
As noted above, one of the key differences between the old scenery and WS3.0 is that a given triangle in the terrain mesh doesn't have a single landclass.  Instead we need to look it up.
* simgear/simgear/scene/tgdb/VPBTechnique.cxx is used to create the mesh from the heightmap. 
* The key function is VPBTechnique::init.  At present this creates a BufferData containing an EffectGeode.
* We (probably?) want to change that so it creates an osg::Group node, which contains both the EffectGeode, plus some other nodes containing the trees and other random objects. 
** Because this is already loaded in a PagedLOD, provided we generate this at the right LOD Level (_terrainTile->getTileID().level==6 perhaps?  or configurable), we don't need to mess around with any callbacks.
* The landclass information is stored in the first texture, assigned by applyColorLayers().
* It should be possible to interpolate between the texture coordinates of the generated mesh and lookup the landclass of the texture. (osg::Texture2D.getImage()->getColor(const Vec2 &texcoord).
* We could extend the MaterialLibrary to include lookup via landclass code.  The simplest way would be to add new <name> values that match the values from the landclass texture as integers.  For the hackathon, I suggest just adding landclasses 22-24 to the "EvergreenForest" material.
So the pseudo-code might look like this:
# IF (_terrainTile->getTileID().level==6) THEN
# FOREACH triangle (geometry) :
## Generate a set of random points on the triangle
## FOREACH point (random points) :
### Determine the texture coordinate of the point
### Determine the landclass of the point in the texture
### Lookup the landclass in the MaterialsLibrary
### IF the landclass has mat->get_wood_coverage() > 0 THEN add the point to an appropriate TreeBin in an SGTreeBinList
# use the SGTileDetailsCallback::createForest() method to create the appropriate forest in OSG