text: /* particles - simulator - main.c
   *
   * Copyright 2010 Tim Horton. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are met:
   *
   *    1. Redistributions of source code must retain the above copyright notice,
   *       this list of conditions and the following disclaimer.
   *
   *    2. Redistributions in binary form must reproduce the above copyright
   *       notice, this list of conditions and the following disclaimer in the
   *       documentation and/or other materials provided with the distribution.
   *
   * THIS SOFTWARE IS PROVIDED BY TIM HORTON "AS IS" AND ANY EXPRESS OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
   * EVENT SHALL TIM HORTON OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
   * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  #include <stdio.h>
  #include <stdlib.h>
  
  #include <liblog/liblog.h>
  #include <libparticles/libparticles.h>
  #include <libcomputer/libcomputer.h>
  #include <libsimulator/libsimulator.h>
  #include <libpreviewer/libpreviewer.h>
  #include <librenderer/librenderer.h>
  
  #define BENCHMARK_FRAMES 500
  
  static SMSimulator * simulator;
  
  SMSimulator * simulateFrame()
  {
      SMSimulatorSimulate(simulator);
      SMSimulatorPullData(simulator);
  
      return simulator;
  }
  
  int main(int argc, const char ** argv)
  {
      SMOptionsParse(argc, argv);
  
      simulator = SMSimulatorNewFromFile("../Systems/n-body.psys");
      SMSimulatorPushData(simulator);
  
      if(simulatorOutputMode == SM_PREVIEWER_OUTPUT)
      {
          PVPreviewerInit(&argc, argv);
          PVPreviewerSetFrameCallback(simulateFrame);
          PVPreviewerStart();
      }
      else if(simulatorOutputMode == SM_RENDERER_OUTPUT)
      {
          RERendererSetFrameCallback(simulateFrame);
          RERendererStart();
      }
      else if(simulatorOutputMode == SM_NO_OUTPUT)
      {
          for(unsigned int i = 0; i < BENCHMARK_FRAMES; i++)
              SMSimulatorSimulate(simulator);
      }
  
      return EXIT_SUCCESS;
  }
  