I just discovered this : state() is not valid when _level==0,
because it is doing:
{ return _state_stack[_state_stack.size() - 1]; }
and is returning a wrong index fetch ( 0 - 1 ) == -1
Moreover, st is not used when _level==0 so the line can be moved
to a safer place.
I have 3 issues that are fixed by this set of patches.
1. In extensions.cxx
#else if !defined( WIN32 ) must be changed by
#elif !defined( WIN32 ) because the text after #else
seems to be ignored
2. banner is not available on windows, only cygwin
3. ANSI escape sequences are not interpreted on the
windows console. We just have garbage that is hard
to read.
Under rare circumstances we could encounter a non-cooperative external fdm
that could trigger this condition. This patch catches the problem and returns
rather than letting FG get killed.
Do state sorting by material before adding primitives
in the tile branch. I thought I could see a bit of
improvement in framerate but it is not the case on my setup.
I don't see a degradation though
I am still experimenting with the
code. Here is so far the best I could achieve. The
dark aspect of clouds at dusk or dawn is far better
than the problems of transparency of the previous
version.
Melchior spotted a problem where we can crash an airplane into the
beacon's beam. The patch below enable to mask out a branch from HOT
traversal, whatever the animation.
The beacon.xml file is also included. It has a
<enable-hot type="bool">false</enable-hot> in a halo branch
I was not very happy with the size of the halo, so
I created a new animation to control it. Now we can
control the scale value with the distance from the
viewer to the object. The towers are now beginning to
look good. They might need some tuning though. If
you want to play, locate in radio-*.xml this code :
<animation>
<type>dist-scale</type>
<object-name>RedLight.2</object-name>
<interpolation>
<entry><ind>0</ind><dep>0.1</dep></entry>
<entry><ind>500</ind><dep>0.3</dep></entry>
<entry><ind>16000</ind><dep>3</dep></entry>
</interpolation>
</animation>
You get the idea ? ind is the distance, dep is the
resulting scale value.
The medium tower appears brighter than the tall one,
because the lights are closer to each other. Maybe
they need a smaller scale factor at distance. Feel
free to modify these values if you find a better
setup.
About the code : I renamed flash to custtrans because the
ssg branch is now less specialized. It needs a callback
to compute the so called 'custom transformation'. It can
be used for the SGFlashAnimation and the new
SGDistScaleAnimation. So please cvs remove flash.[ch]xx and
add custtrans.[ch]xx. I also undo some of the code I send
you yesterday that was totally useless. It is replaced by
something simpler and that works.
There is also a patch to matmodel.cxx. This is not related
and was something I forgot. Its purpose is to set the
alpha test on material billboard models that are likely to
be trees to lessen a transparency weird effect with clouds.
I modified the included animation.cxx to have a randomly displaced
time origin, to break the unison. And the flashing period is also
random as you noticed. I also put all the flashing light of the pole
in the same animation so they flash in the same rhythm.
Fix a memory leak, and brownian animation, if not motion.
I have 2 new files : personality.[ch]xx . They store the personality
data that would be deleted when the object is destroyed, instead
of staying in the animation maps. I also manage the current animation
step better and the towers are not flashing randomly now.
Makefile.am is updated.
modellib.cxx :
Add a branch between the model and its transformation to add
a unique identifier for the model. I called it "personality
branch" and it maintains a "current_object" in SGAnimation.
Animations specifically written to support it ( currently only
the timed animation ) can add a degree of variety among the
occurrences of the same model that would look otherwise cloned.
flash.[ch]xx :
Better compute the view vector. The flash is now syncronized with
its axis even at the edge of the screen.
animation.[ch]xx :
Lots of changes :
- add a condition to 'rotate', 'spin', 'translate' and 'range'.
When a condition is specified *and* it evaluates to false, the
animation becomes a no-op. Possible usage : no rotation during
daylight, LOD range variable along the day, ...
- use different durations for each branch in the timed animation.
Enable the use of multiple <branch-duration-sec>, one for each
<object-name> specified. Usage : strobes with flash light.
- allow randomization of the <branch-duration-sec>, by using
<random><min>_min_value_</min><max>_max_value_</max></random>.
The value computed once is between _min_value_ and _max_value_.
- implement model personality in timed animation. If
<use-personality type="bool">true</use-personality> is specified,
a different set of duration is created for every model in the
scenegraph using this animation. Best if used with randomization.
When using strobes where the population of the same object is
dense, it avoids the "cheasy" clone effect.
this patch introduce a new kind of animation and ssg branch.
I called them flash animation, because they help me to
enhance the look of the rotating beacon and possible future
lighthouse. It computes the cosine of the angle between an
arbitrary axis, transformed by the current modelview matrix,
and the view direction. No trig involved, just a dot/scalar
product.
The computed value can be modified by three parameters,
power, factor and offset, according to the formulae :
value = factor * pow( cosine, power ) + offset.
It is clamped between a minimum and a maximum.
This value is then used as the scale factor of a matrix
transformation applied to the children of the SGFlash
branch.
The xml syntax, with default values, is :
<animation>
<type>flash</type>
<object-name>HaloObject</object-name>
<center>
<x-m>0</x-m>
<y-m>0</y-m>
<z-m>0</z-m>
</center>
<axis>
<x>0</x>
<y>0</y>
<z>1</z>
</axis>
<power>1</power>
<factor>1</factor>
<offset>0</offset>
<min>0</min>
<max>1</max>
<two-sides>false</two-sides>
</animation>