//
// C++ Implementation: MilkdropPresetFactory
//
// Description:
//
//
// Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2008
//
// Copyright: See COPYING file that comes with this distribution
//
//
//
#include "MilkdropPresetFactory.hpp"
#include "MilkdropPreset.hpp"
#include "BuiltinFuncs.hpp"
#include "Eval.hpp"
#include "IdlePreset.hpp"
#include "PresetFrameIO.hpp"


MilkdropPresetFactory::MilkdropPresetFactory(int gx, int gy)
  : _usePresetOutputs(false)
{
  /* Initializes the builtin function database */
  BuiltinFuncs::init_builtin_func_db();

  /* Initializes all infix operators */
  Eval::init_infix_ops();

  _presetOutputs = createPresetOutputs(gx,gy);
  _presetOutputs2 = createPresetOutputs(gx, gy);
}

MilkdropPresetFactory::~MilkdropPresetFactory()
{
  std::cerr << "[~MilkdropPresetFactory] destroy infix ops" << std::endl;
  Eval::destroy_infix_ops();
  std::cerr << "[~MilkdropPresetFactory] destroy builtin func" << std::endl;
  BuiltinFuncs::destroy_builtin_func_db();
  std::cerr << "[~MilkdropPresetFactory] delete preset out puts" << std::endl;
  delete(_presetOutputs);
  delete(_presetOutputs2);
  std::cerr << "[~MilkdropPresetFactory] done" << std::endl;
}

/* Reinitializes the engine variables to a default (conservative and sane) value */
void
resetPresetOutputs(PresetOutputs * presetOutputs)
{
  presetOutputs->zoom               = 1.0;
  presetOutputs->zoomexp            = 1.0;
  presetOutputs->rot                = 0.0;
  presetOutputs->warp               = 0.0;

  presetOutputs->sx                 = 1.0;
  presetOutputs->sy                 = 1.0;
  presetOutputs->dx                 = 0.0;
  presetOutputs->dy                 = 0.0;
  presetOutputs->cx                 = 0.5;
  presetOutputs->cy                 = 0.5;

  presetOutputs->screenDecay        = .98;

  presetOutputs->wave.r             = 1.0;
  presetOutputs->wave.g             = 0.2;
  presetOutputs->wave.b             = 0.0;
  presetOutputs->wave.x             = 0.5;
  presetOutputs->wave.y             = 0.5;
  presetOutputs->wave.mystery       = 0.0;

  presetOutputs->border.outer_size  = 0.0;
  presetOutputs->border.outer_r     = 0.0;
  presetOutputs->border.outer_g     = 0.0;
  presetOutputs->border.outer_b     = 0.0;
  presetOutputs->border.outer_a     = 0.0;

  presetOutputs->border.inner_size  = 0.0;
  presetOutputs->border.inner_r     = 0.0;
  presetOutputs->border.inner_g     = 0.0;
  presetOutputs->border.inner_b     = 0.0;
  presetOutputs->border.inner_a     = 0.0;

  presetOutputs->mv.a               = 0.0;
  presetOutputs->mv.r               = 0.0;
  presetOutputs->mv.g               = 0.0;
  presetOutputs->mv.b               = 0.0;
  presetOutputs->mv.length          = 1.0;
  presetOutputs->mv.x_num           = 16.0;
  presetOutputs->mv.y_num           = 12.0;
  presetOutputs->mv.x_offset        = 0.02;
  presetOutputs->mv.y_offset        = 0.02;


  /* PER_FRAME CONSTANTS END */
  presetOutputs->fRating            = 0;
  presetOutputs->fGammaAdj          = 1.0;
  presetOutputs->videoEcho.zoom         = 1.0;
  presetOutputs->videoEcho.a            = 0;
  presetOutputs->videoEcho.orientation  = Normal;

  presetOutputs->wave.additive              = false;
  presetOutputs->wave.dots                  = false;
  presetOutputs->wave.thick                 = false;
  presetOutputs->wave.modulateAlphaByVolume = 0;
  presetOutputs->wave.maximizeColors        = 0;
  presetOutputs->textureWrap        = 0;
  presetOutputs->bDarkenCenter      = 0;
  presetOutputs->bRedBlueStereo     = 0;
  presetOutputs->bBrighten          = 0;
  presetOutputs->bDarken            = 0;
  presetOutputs->bSolarize          = 0;
  presetOutputs->bInvert            = 0;
  presetOutputs->bMotionVectorsOn   = 1;

  presetOutputs->wave.a               =1.0;
  presetOutputs->wave.scale           = 1.0;
  presetOutputs->wave.smoothing       = 0;
  presetOutputs->wave.mystery         = 0;
  presetOutputs->wave.modOpacityEnd   = 0;
  presetOutputs->wave.modOpacityStart = 0;
  presetOutputs->fWarpAnimSpeed     = 0;
  presetOutputs->fWarpScale         = 0;
  presetOutputs->fShader            = 0;

  /* PER_PIXEL CONSTANT END */
  /* Q VARIABLES START */

  for (int i = 0;i< 32;i++)
    presetOutputs->q[i] = 0;

  //  for ( std::vector<CustomWave*>::iterator pos = presetOutputs->customWaves.begin();
  //          pos != presetOutputs->customWaves.end(); ++pos )
  //    if ( *pos != 0 ) delete ( *pos );

  //  for ( std::vector<CustomShape*>::iterator pos = presetOutputs->customShapes.begin();
  //          pos != presetOutputs->customShapes.end(); ++pos )
  //    if ( *pos != 0 ) delete ( *pos );

  presetOutputs->customWaves.clear();
  presetOutputs->customShapes.clear();

  /* Q VARIABLES END */
}


/* Reinitializes the engine variables to a default (conservative and sane) value */
void
MilkdropPresetFactory::reset()
{
  resetPresetOutputs(_presetOutputs);
  resetPresetOutputs(_presetOutputs2);
}

PresetOutputs*
MilkdropPresetFactory::createPresetOutputs(int gx, int gy)
{
  PresetOutputs *presetOutputs = new PresetOutputs();

  presetOutputs->Initialize(gx,gy);

  /* PER FRAME CONSTANTS BEGIN */
  presetOutputs->zoom               = 1.0;
  presetOutputs->zoomexp            = 1.0;
  presetOutputs->rot                = 0.0;
  presetOutputs->warp               = 0.0;

  presetOutputs->sx                 = 1.0;
  presetOutputs->sy                 = 1.0;
  presetOutputs->dx                 = 0.0;
  presetOutputs->dy                 = 0.0;
  presetOutputs->cx                 = 0.5;
  presetOutputs->cy                 = 0.5;

  presetOutputs->screenDecay        =.98;


  //_presetInputs.meshx = 0;
  //_presetInputs.meshy = 0;


  /* PER_FRAME CONSTANTS END */
  presetOutputs->fRating            = 0;
  presetOutputs->fGammaAdj          = 1.0;
  presetOutputs->videoEcho.zoom         = 1.0;
  presetOutputs->videoEcho.a            = 0;
  presetOutputs->videoEcho.orientation  = Normal;

  presetOutputs->textureWrap        = 0;
  presetOutputs->bDarkenCenter      = 0;
  presetOutputs->bRedBlueStereo     = 0;
  presetOutputs->bBrighten          = 0;
  presetOutputs->bDarken            = 0;
  presetOutputs->bSolarize          = 0;
  presetOutputs->bInvert            = 0;
  presetOutputs->bMotionVectorsOn   = 1;

  presetOutputs->fWarpAnimSpeed     = 0;
  presetOutputs->fWarpScale         = 0;
  presetOutputs->fShader            = 0;

  /* PER_PIXEL CONSTANTS BEGIN */

  /* PER_PIXEL CONSTANT END */

  /* Q AND T VARIABLES START */

  for (int i = 0;  i < NUM_Q_VARIABLES;  i++)
    presetOutputs->q[i] = 0;

  /* Q AND T VARIABLES END */
  return presetOutputs;
}


std::auto_ptr<Preset>
MilkdropPresetFactory::allocate(
const std::string & url,
const std::string & name,
const std::string & author
)
{
  PresetOutputs *presetOutputs = _usePresetOutputs ? _presetOutputs : _presetOutputs2;

  _usePresetOutputs = !_usePresetOutputs;
  resetPresetOutputs(presetOutputs);

  std::string path;

  if (PresetFactory::protocol(url, path) == PresetFactory::IDLE_PRESET_PROTOCOL) {
    return IdlePresets::allocate(path, *presetOutputs);
  } else
    return std::auto_ptr<Preset>(new MilkdropPreset(url, name, *presetOutputs));
}
