## Create a simple OpenGL/C++ game with white_dune

You can create OpenGL-programs written in C++ with white_dune.
Here a simple example is shown, the needs only a few lines of programming code.
In the first step a prototype with X3D/javascript is created, that is extended with C++ later.

### javascript/X3D prototype

As base, the in X3D available white_dune logo is used. It is a 3d model of a pinguin in a landscape of dunes and a pyramid.
For programming, it makes no difference, is the pinguin is replaced with a box and the landscape is replaced with a large thin box...
In the first step, the target (pinguin or box) is animated with a CurveAnimation.
Next, a Text-node with "Game over" is created.
Next a Switch-node is created and the target is moved into it.
To make the target visible, Switch.whichChoice must be set to 0.
Next another Switch-node is created and the text is moved into it.
Next a Script-node is created.
Next Routes/IS -> rebuild is used. A new window is shown, that shows the CurveAnimation.
Next, the Script-node is selected (clicked).
A SFVec3f-input-function "transform_in" is created.
In the same way. a SFVec3f-input-function "proximity_in" is created.
Next a SFInt32-output-variable "out_text" is created.
Next a SFInt32-output-variable "out_tux" is created.
Now a Proximity-Sensor-node is created and Routes/IS -> show node on top is used.
Now the script-node is selected and Routes/IS -> show node on top is used.
The node are moved and you connect ProxomitySensor.position_changed and Script.proximity_in
Next, you connect CurveAnimation1.position_changed and Script.translation_in
Next, you connect Script.out_text and Switch.set_whichChoice of the text Switch.
Next, you connect Script.out_tux and Switch.set_whichChoice of the target Switch.
Now the script-node is selected and a SFVec3f-data-variable transfrom_data is created.
Next a SFBool-data-variable game_over is created.
The script node is selected and Edit -> URL edit is used .
The following javascript programm has to be inserted:

    "ecmascript:

            function transform_in(value)
            {
               transform_data = value;
            }

            function proximity_in(value)
            {
               if (!(game_over) &&
                   (Math.abs(transform_data.x - value.x) < 2) &&
                   (Math.abs(transform_data.y - value.y) < 3) &&
                   (Math.abs(transform_data.z - value.z) < 2)) {
                   game_over = true;
                   out_text = 0; // show Text
                   out_tux = -1; // hide TUX
                   }
            }
    "

To make the X3D-Game available, the X3D-Browser "FreeWRL" must be installed and Options -> preview settings must be configured for File -> Previe.
Now File -> Preview has to be used and via the FreeWRL navigation the target is reached, so the "show Text/hide TUX" code is executed.
Screenshots of the game:
Before the reach of the target:
After the reach of the target:

### Extension with C++

Now the Script node is selected and Edit -> URL edit is used.
The programm is extended with a C++ part:

    "ecmascript:

            function transform_in(value)
            {
               transform_data = value;
            }

            function proximity_in(value)
            {
               if (!(game_over) &&
                   (Math.abs(transform_data.x - value.x) < 2) &&
                   (Math.abs(transform_data.y - value.y) < 3) &&
                   (Math.abs(transform_data.z - value.z) < 2)) {
                   game_over = true;
                   out_text = 0; // show Text
                   out_tux = -1; // hide TUX
                   }
            }
    "
    "c++:

       X3dScript_Script1 *self = (X3dScript_Script1 *)node;
       self->transform_data[0] = self->transform_in[0];
       self->transform_data[1] = self->transform_in[1];
       self->transform_data[2] = self->transform_in[2];
       if (!(self->game_over) &&
           (fabsf(self->transform_data[0] - self->proximity_in[0]) < 2) &&
           (fabsf(self->transform_data[1] - self->proximity_in[1]) < 3) &&
           (fabsf(self->transform_data[2] - self->proximity_in[2]) < 2)) {
           self->game_over = true;
           self->out_text = 0; // show Text
           self->out_tux = -1; // hide TUX
       }
    "

Now the C++-Export-Verzeichnis of white_dune need to be copied to the HOME-Verzeichnis:

    $ cp -r wdune-*/docs/export_example_c++/opengl_example/ $HOME

The created X3D-Datei must be stored to $HOME/opengl_example/robot.x3dv
Change to the directory

    $ cd $HOME/opengl_example/

And use

    $ make && ./render

to compile and execute the programm.