Use an exception rather than polling a flag, for checking errors
during BTG reading. This should allow us to give a correctly
identified error, at exactly the point the read fails.
When an effect defines no shader sources, special case this error to
avoid confusing result from SGProgram.
Add error-context for readNode STG loading, so failures inside an
STG can be attributed
The use of SGShared for IReceiver derived conflicted with other uses of SGShared / SGReferenced - and after consideration transmitters should probably remain static for the lifetime of the application.
Any dynamic transmitters will need careful consideration if working in a threaded environment to ensure that a transmitter doesn't go out of scope before any notifications that it has issued have finished being processed by other threads.
After testing with multithreading there were still problems related to
scope and transmitters - because a transmitter that was on the stack
as an object could go out of scope before a notify all had finished
and lead to invalid data and a crash
The solution is to always have Recipients allocated via new() and to
use a shared pointer to manage the scope and garbage collect when the
last reference goes out of scope.
To achieve the threadsafe minimal locking the rules are as follows;
* All recipients must be allocated via new()
* Register and DeRegister will only happen when on the outermost
level of NotifyAll.
- all other add or delete will be put into the pending queue and
added at the start of the next outer notify all
- at outer level notify all a lock will be taken to process pending
items
* during the main notify processing there will be no locks - however
it is also assumed that the recipient list will not be changed
- Add and AREA_FEATURE_LIST STG verb.
- /sim/rendering/static-lod/area-features-lod-level to control point at
which such feature are rendered
- /sim/rendering/static-lod/lod-leve[n]/area-features-min-width sets
the minimum width for feature rendering at that LoD level.
STG Format:
AREA_FEATURE_LIST <file> <material>
File format:
Area Attrib A B C D lon0 lat0 lon1 lat1 lon2 lat2 lon3 lat4....
where:
Area is the area of the feature in m^2
Attrib is an integer attribute (currently unused)
A, B, C, D are generic float attributes. Their interpretation may vary by feature type
lon[n], lat[n] are pairs of lon/lat defining straight road segments
- Generate vegetation based on underlying landclass material mapping
- Reduce frame pauses by removing terrain init from update visitor
- Fix a couple of small timing windows causing crashes.
- Rip out various pieces of irrelevant code, simplifying VPBTechnique.
Largely dealing with multiple textures per terrain tile, which we
don't need.
- Use a lookup of the landclass of mesh vertices to identify sections of
the mesh that are entirely in water, and split those out into a
separate water mesh, using it's own Effect.