<?php
require("../template.php");

# Now set the title of the page:
setPageTitle("Android");

# Make the header.
generateHeader($_SERVER['PHP_SELF']);
?>

<p>

  FreeGLUT 3.0 introduces support for the Android platform.<br />

  This platform is different than traditional desktop platforms, requiring cross-compilation, interfacing with a touchscreen, and ability for your application to be paused and resumed at any time.<br />

  Here's how:

</p>


<ul>
<li><a href="#compiling">Compiling</a></li>
<li><a href="#using">Using in your projects</a></li>
<li><a href="#roadmap">Roadmap</a></li>
<li><a href="#api">New API</a></li>
<li><a href="#notes">Notes</a></li>
<li><a href="#links">Links</a></li>
</ul>


<a name="compiling"></a>
<h1>Compiling</h1>

  <ul>

    <li>Note: at the moment, you need to chose between OpenGL ES 1.0 (FREEGLUT_GLES1) or 2.0 (FREEGLUT_GLES2) at compile time.<br />
    In the near future, we may implement a way to set this at run-time.</li>

    <li>

      Use your own cross-compiler for Android, or export the one from
      the Android NDK:

      <pre>
        /usr/src/android-ndk-r7c/build/tools/make-standalone-toolchain.sh \
          --platform=android-9 \
          --install-dir=/usr/src/ndk-standalone-9
      </pre>

    </li>

    <li>Compile FreeGLUT and install it in your Android cross-compiler
        path:

      <pre>
        PATH=/usr/src/ndk-standalone-9/bin:$PATH
        cd /usr/src/freeglut-x.x/
        mkdir cross-android-gles2/
        cd cross-android-gles2/
        cmake \
          -D CMAKE_TOOLCHAIN_FILE=../android_toolchain.cmake \
          -D CMAKE_INSTALL_PREFIX=/usr/src/ndk-standalone-9/sysroot/usr \
          -D CMAKE_BUILD_TYPE=Debug \
          -D FREEGLUT_GLES2=ON \
          -D FREEGLUT_BUILD_DEMOS=NO \
          ..
        make -j4
        make install
        # Only static for now:
        rm -f /usr/src/ndk-standalone-9/sysroot/usr/lib/libfreeglut-gles?.so*
      </pre>

    </li>

  </ul>

<a name="using"></a>
<h1>Using in your projects</h1>

  <h2>Compile your own project using common build systems</h2>

    <p>For instance if you use the autotools:</p>

    <pre>
      PATH=/usr/src/ndk-standalone-9/bin:$PATH
      export PKG_CONFIG_PATH=/usr/src/ndk-standalone-9/sysroot/usr/share/pkgconfig
      ./configure --host=arm-linux-androideabi --prefix=/somewhere
      make
      make install
    </pre>

    <p>If you use CMake, you may want to copy our Android toolchain
      'android_toolchain.cmake':</p>

    <pre>
      PATH=/usr/src/ndk-standalone-9/bin:$PATH
      export PKG_CONFIG_PATH=/usr/src/ndk-standalone-9/sysroot/usr/share/pkgconfig
      cp .../freeglut-x.x/android_toolchain.cmake .
      mkdir cross-android/
      cd cross-android/
      cmake \
        -D CMAKE_TOOLCHAIN_FILE=../android_toolchain.cmake \
        -D CMAKE_INSTALL_PREFIX=/somewhere \
        -D CMAKE_BUILD_TYPE=Debug \
        -D MY_PROG_OPTION=something ... \
        ..
      make -j4
      make install
    </pre>

    <p>Check <code>progs/test-shapes-gles1/</code> in the FreeGLUT
      source distribution for a complete, stand-alone example.</p>

<h2>Compile your own project using the NDK build-system</h2>

  <ul>

    <li>

      Create a module hierarchy pointing to FreeGLUT, with our Android.mk:

      <pre>
        mkdir freeglut-gles2/
        cp .../freeglut-x.x/android/gles2/Android.mk freeglut-gles2/
        ln -s /usr/src/ndk-standalone-9/sysroot/usr/include freeglut-gles2/include
        ln -s /usr/src/ndk-standalone-9/sysroot/usr/lib freeglut-gles2/lib
      </pre>

    </li>

    <li>

      Reference this module in your jni/Android.mk:

      <pre>
        LOCAL_STATIC_LIBRARIES := ... freeglut-gles2
        ...
        $(call import-module,freeglut-gles2)
      </pre>

    </li>

    <li>

      You now can point your NDK_MODULE_PATH to the directory containing the module:

      <pre>
        ndk-build NDK_MODULE_PATH=.
      </pre>

    </li>

  </ul>


<a name="roadmap"></a>
<h1>Roadmap</h1>

Done:
<ul>
<li>Initialize context with EGL</li>
<li>Keyboard support</li>
<li>Mouse support</li>
<li>Virtual keypad (on touchscreen)</li>
<li>Extract assets in cache dir on start-up</li>
<li>Make EGL support reusable by Mesa X11</li>
<li>freeglut_std.h can be used with GLES1 or GLES2 or non-ES headers<br />
(using -DFREEGLUT_GLES1 and -DFREEGLUT_GLES2)</li>
<li>GLES1 and GLES2 support for geometry</li>
<li>Pause/resume application support</li>
<li>Callback to reload OpenGL resources lost during a pause</li>
<li>Callback for pause/resume notifications</li>
</ul>

TODO:
<ul>
<li>Multi-touch support (glutMultiMotionFunc & al.)</li>
<li>Display translucent keys on virtual keypad</li>
<li>API to access raw JVM structure and raw Activity(ies?)
  structure</li>
<li>API to detect touchscreen presence</li>
<li>API (or configuration file?) to disable assets extraction</li>
<li>Accelerometer as a joystick input</li>
</ul>

Possibly implemented later:
<ul>
<li>Support for menus and basic fonts</li>
<li>Open new windows (if that's possible)</li>
<li>Joystick support (note: xperia play doesn't have a joystick, but a
  touchpad)</li>
</ul>

<a name="api"></a>
<h1>New API</h1>

New callbacks were added : see <a href="api.php#Android">API page</a>.

New functions will be necessary to :
<ul>
<li>detect touchscreen presence</li>
<li>disable assets extraction</li>
</ul>

(Work In Progress)

<a name="notes"></a>
<h1>Notes</h1>

<ul>

  <li>
    Android never truly kills an application, even when pressing the
    Back button, even when the application
    is <code>onDestroy</code>'d: the process is still running and
    ready to accept <code>onCreate</code> event to become active
    again.<br />

    By default, FreeGLUT <code>exit()</code>s when the last window is
    closed (without returning to your <code>main</code>).  But this
    behavior can be changed
    with <code>glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, ...)</code>,
    in which case your have to either <code>exit()</code> yourself at
    the end of your <code>main</code>, or make sure
    your <code>main</code> can be called multiple times (in
    particular: beware of <code>static</code> variables that won't be
    reinitialized).
  </li>

  <li>
    When a key is repeated, down and up events happen most often at
    the exact same time.  This makes it impossible to animate based on
    key press time.<br />

    e.g. down/up/wait/down/up rather than down/wait/down/wait/up<br/>

    This looks like a bug in the Android virtual keyboard system :/
    Real buttons such as the Back button appear to work correctly
    (series of down events with proper getRepeatCount value).<br />

    To work around this, FreeGLUT provides its own minimal virtual
    keypad.  It may be replaced by a virtual (touchscreen) joystick.
  </li>

</ul>

<a name="links"></a>
<h1>Links</h1>

<ul>

  <li>http://pygame.renpy.org/ : Pygame Subset for Android, it
    designed an API for managing Android app lifecycle
    (<code>android.check_pause</code> and
    <code>android.wait_for_resume</code>)</li>

</u>

<?php generateFooter(); ?>