<!-- ##### SECTION Title ##### -->
opengl

<!-- ##### SECTION Short_Description ##### -->
This part is responsible for the pseudo3D rendering through OpenGl and gives methods to adapt the view.

<!-- ##### SECTION Long_Description ##### -->
<para>
This is the heart of V_Sim. It creates the image to reprents the data.
</para>
<para>
The rendering is done in an OpenGl viewport whose size is given by the bounding box (plus 10%). The camera can be positionned with three angles (theta, phi and omega) and has a zoom factor (gross) and a perspective value (d_red). The angle theta is around the z axis (box coordinates), phi is around the new x axis (after the theta rotation) and omega is a rotation around the axis which goes from the observer to the center of the bounding box. By default the camera looks at the center of the bounding box but this can be changed with the Xs and Ys parameters. These values are stored and are readable through the #OpenGLCamera structure. They must be changed with the following methods : setCameraThetaPhiOmega(), setCameraGross(), setCameraPersp() and setCameraXsYs().
</para>
<para>
This part introduces also different parameters to tune the OpenGl rendering. First is the rendering mode. It has three possible values : wireframe (all objects are drawn as lines), flat (each polygon has an uniform color) and smooth (the color of each polygon is non uniform to better represent the lighting effect). The second parameter is an antialiasing option on lines and the last affects the precision of the rendering. Default value is 100%, but if the system is too slow it can be decreased. It decreased the number of rendered polygons. Thus all external methods that want to draw forms should use the getNumberOfFacettes() method to know their number of polygons and listen to the OpenGLFacetteChanged signal when they must recreate their objects.
</para>
<para>
There is a last parameter which controls when render is done. There are two states : whenever a changing occurs (in fact when the OpenGLAskForReDraw signal is received) or only the OpenGLForceReDraw is received.
</para>
<para>
Except when high performances are required, this module never makes a redraw by itself, even when parameters such as the camera position are changed. The redraw must be asked by the client by emitting the OpenGLAskForReDraw signal or the OpenGLForceReDraw signal. This is to avoid situations when the client makes different changes but want just only one redraw at the end. All set methods return a boolean which informs the client of the opportunity to redraw after the set occurs. For example, if the client call a set change on theta or phi but the server returns FALSE, it means that not emission of OpenGLAskForReDraw is needed (for example because theta or phi had already these values).
</para>
<para>
This modules gives also methods to interactively change the camera position or to select object on the screen. The client must call the initPickObserve() method to initialise this possibilities. When the client wants to stop it, it must call endPickObserve(). Then to begin an observe session (change the camera position) it must call beginObserve(). At every moment the client can change from observe to pick session through a call to beginPick(). There are two 'observe' modes. The first, called 'constrained' (cf. #OPENGL_OBSERVE_CONSTRAINED) corresponds to movements along parallels and meridians. When the mouse is moved along x axis, the camera raotates along a parallel. When the camera is moved along y axis, the camera rotate along a meridian. The top is always pointing to the north pole (in fact, omega is always forced to 0 in this mode). This mode has a 'strange' behavior when the observer is near a pole : moving mouse along x axis make the box rotates on itself. It is normal, because movements on x axis is equivalent to movements on parallel and near the poles, parallel are small circle around the z axis. This can be unnatural in some occasion and the other mode, called 'walker' (see #OPENGL_OBSERVE_WALKER) can be used instead of the 'constrained' mode. In the former, the moving is done has if the observer was a walking ant on a sphere : moving the mouse along y axis makes the ant go on or forward ; and x axis movements makes the ant goes on its left or on it right. This is a more natural way to move the box but it has the inconvient that it is hard to return in a given position (omega has never the right value).
</para>

<!-- ##### SECTION See_Also ##### -->
<para>

</para>

<!-- ##### SECTION Stability_Level ##### -->


<!-- ##### FUNCTION setAntialias ##### -->
<para>

</para>

@value: 
@Returns: 


<!-- ##### FUNCTION getAntialias ##### -->
<para>

</para>

@Returns: 


<!-- ##### FUNCTION setFakeBackingStore ##### -->
<para>

</para>

@bool: 


<!-- ##### FUNCTION getFakeBackingStore ##### -->
<para>

</para>

@Returns: 


<!-- ##### FUNCTION setImmediateDrawing ##### -->
<para>

</para>

@bool: 


<!-- ##### FUNCTION getImmediateDrawing ##### -->
<para>

</para>

@Returns: 


<!-- ##### FUNCTION openGLGet_allRenderingModesI18n ##### -->
<para>

</para>

@Returns: 


<!-- ##### FUNCTION openGLInit_context ##### -->
<para>

</para>



<!-- ##### FUNCTION setOpenGlMaterial ##### -->
<para>

</para>

@material: 
@rgba: 


<!-- ##### STRUCT VisuPick_struct ##### -->
<para>

</para>

@data: 
@node: 
@button: 
@shiftMod: 
@x: 
@y: 

<!-- ##### TYPEDEF VisuPick ##### -->
<para>

</para>


<!-- ##### USER_FUNCTION callBackOnNodeSelectedFunc ##### -->
<para>

</para>

@pickData: 
@data: 


<!-- ##### FUNCTION dumpViewToImage ##### -->
<para>

</para>

@dataObj: 
@buffer: 
@width: 
@height: 
@Returns: 


<!-- ##### FUNCTION initOpengl ##### -->
<para>

</para>

@Returns: 
<!-- # Unused Parameters # -->
@width: 
@height: 


