\documentclass[a4paper,12pt]{article}
 
% packages
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{listings}
\usepackage{url}
\usepackage{color}
\usepackage[top=3cm, bottom=3cm, left=3cm, right=3cm]{geometry}

\input{title}

\begin{document}
   \author{Daniel Chappuis}
   \title{ReactPhysics3D library \\ User Manual}
   \maketitle

   \tableofcontents

   \newpage
 

   \section{Introduction}

  ReactPhysics3D is an open source C++ physics engine library that can be used
  in 3D simulations and games. The library is released under the ZLib license.

   \section{Features}

   The ReactPhysics3D library has the following features :

   \begin{itemize}
    \item Rigid body dynamics 
    \item Discrete collision detection 
    \item Collision shapes (Sphere, Box, Cone, Cylinder) 
    \item Broadphase collision detection (Sweep and Prune using AABBs) 
    \item Narrowphase collision detection (GJK/EPA) 
    \item Collision response and friction (Sequential Impulses Solver)
    \item Multi-platform (Windows, Linux, Mac OS X)
    \item Documentation (User manual and Doxygen API)
    \item Unit tests
   \end{itemize}

  \section{What's new in this version}

  The current version is version 0.3.0 The following things have been
  added or improved in this new version : \\
   
  \begin{itemize}
    \item The Sweep-and-Prune broad-phase collision detection
      algorithm has been rewritten according to the technique
      described by Pierre Terdiman at
      \url{http://www.codercorner.com/SAP.pdf} to be much more efficient
      than the previous naive implementation.
    \item The contact solver has been rewritten to use the Sequential
      Impulses technique from Erin Catto which is mathematically
      equivalent to the Projected Gauss Seidel technique that was used
      before. The Sequential Impulse technique is more
      intuitive.
    \item Implementation of a dedicated collision detection algorithm for spheres
      against spheres instead of using GJK/EPA algorithm.
    \item Make GJK/EPA algorithm more robust for spheres.
    \item Make possible to use a unique instance of a collision shape
      for multiple rigid bodies.
    \item Change the structure of the code for a better separation
      between the collision detection and the dynamics simulation code.
    \item Create the API documentation using Doxygen
    \item Add Unit tests
   \end{itemize}

    \section{License}

    The ReactPhysics3D library is released under the ZLib license. For more information, read the "LICENSE" file.

    \section{Compilation}
    \label{sec:compilation}

    You can use the CMake software to generate the makefiles or the 
    project files for your IDE. CMake can be downloaded at
    \url{http://www.cmake.org} or using you package-management program
    (apt, yum, \dots) on Linux. Then, you will be able to compile the library to create the static library
    file. In order to use ReactPhysics3D in
    your application, you can link your program with this static library.

    \subsection{Linux and Mac OS X}  

    To build the ReactPhysics3D library, create a folder into which
    you want to build the library. Then go into that folder and run
    the \texttt{cmake} command : \\

    \texttt{cmake \textless path\_to\_library\textgreater \ -G "Unix Makefiles" -DCMAKE\_BUILD\_TYPE=Release} \\

    where \texttt{\textless path\_to\_library\textgreater} must be replaced
    by the path to the library which is the path to the
    \texttt{reactphysics3d-0.3.0/} folder. It is the folder that
    contains the \texttt{CMakeLists.txt} file. This will generate the
    makefiles into your build directory you have created before. Notice that the previous command generates the makefiles to
    compile the library in Release mode. If you wan to generate the makefiles to
    compile in Debug mode, you will have to use the following command : \\

    \texttt{cmake \textless path\_to\_library\textgreater \ -G "Unix Makefiles" -DCMAKE\_BUILD\_TYPE=Debug} \\

   If you also want to build the examples at the same time, you can
   use the following command :  \\

   \texttt{cmake \textless path\_to\_library\textgreater \ -G "Unix Makefiles" -DCMAKE\_BUILD\_TYPE=Release \\
     -DCOMPILE\_EXAMPLES=True } \\

  In order to compile the examples, the GLUT or FREEGLUT library needs to be
  installed on your system if you use Mac OS X. \\

  If you want to build the unit tests, you can use the following
  command : \\

  \texttt{cmake \textless path\_to\_library\textgreater \ -G "Unix Makefiles" -DCMAKE\_BUILD\_TYPE=Debug \\
     -DCOMPILE\_TESTS=True } \\

  Now that you have generated the makefiles with the CMake software,
  you can compile the code to build the static library in the
  \texttt{/lib} folder with the following command in your build directory : \\
    
    \texttt{make}  \\

   This will also compile the examples if you have used the above
   option to do it.

    \subsection{Windows}

     On Windows, you can also use the CMake software to generate the
     files that you will be able to use in your favorite IDE to
     compile the library and examples. \\ 

     First, download the CMake
     software for Windows and install it. Then, run the
     \texttt{cmake-gui} program. The program will ask you for the
     source folder which is the \texttt{reactphysics3d-0.3.0/} folder of
     the library. You will also have to select a folder where you want to
     build the library and the examples. Select any empty folder that
     is on your system. Then, you can click on
     \texttt{Configure}. CMake will ask you to choose an IDE that is on
     your system. For instance, you can select Visual Studio. Then you
     can change the compilation options. For instance, if you want to
     generate the files to compile the examples, you have to check the option
     \texttt{COMPILE\_EXAMPLES}. If you want to compile the unit
     tests, you need to check the option \texttt{COMPILE\_TESTS}.
     Note that compiling the examples
     requires the GLUT or FREEGLUT library to be installed on your system. Once
     this is done, you can click on \texttt{Configure} again and
     finally on \texttt{Generate}. \\ 
    
     Now, if you go into the folder you have chosen to build the
     library, you should be able to open the
     Visual Studio Project that CMake has created and compile the
     ReactPhysics3D library and the examples. 

    \section{Using ReactPhysics3D in your application}

    In order to use the library in your own application, first build
    the static library of ReactPhysics3d as described above to get the
    static library file in the \texttt{/lib} folder. Then, in your code, you have to include
    the ReactPhysics3D header file with the line : \\

    \texttt{\#include "reactphysics3d.h"} \\

    Note that the \texttt{reactphysics3d.h} header file can be found in the
    \texttt{/src} folder of the library. Do not forget to add the
    \texttt{/src} folder in your include directories in order that the
    \texttt{reactphysics3d.h} file is accessible in your code. \\

    Don't forget to also link your application with the ReactPhysics3D
    static library.  \\
  
    Then, you should be able to compile your application using the
    ReactPhysics3D library. You should also take a look at the
    examples and the API documentation to get a better idea of how to use the
    ReactPhysics3D library.

    \section{Examples}

    You can find some OpenGL demos in the \texttt{/examples} folder of
    the library. Follow the instructions described in section
    \ref{sec:compilation} to
    compile the examples. Note that the GLUT or FREEGLUT library is required to
    compile and run the examples.

   \section{API Documentation}

   Some documentation about the API of the code has been generated
   using Doxygen. You will be able to find this documentation in the library archive in the folder \texttt{/documentation/API/html/}. You just
   need to open the \texttt{index.html} file with your favorite web browser.

    \section{Bugs}

    If you find some bugs, do not hesitate to report them on the issue tracker of the ReactPhysics3D website at : \\

    \url{http://code.google.com/p/reactphysics3d/issues/list} \\

    Thanks a lot for reporting the bugs that you find. It will help us to correct and improve the library.
   
\end{document}
