/*=================================================================*/
void SetInitialSeed( int S1, int S2 ){
   Ig1[1] = S1;  Ig2[1] = S2;
   InitGenerator( 1, InitialSeed );
    for ( int g = 2 ; g <= NumberOfGenerators; g++ ) {
      Ig1[g] = MultMod( A1VW, Ig1[g-1], M1 );
      Ig2[g] = MultMod( A2VW, Ig2[g-1], M2 );
      InitGenerator( g, InitialSeed );
   }
}; 
bool mitk::MovieGenerator::WriteCurrentFrameToMovie()
{  
  if (m_renderer) 
  {
    m_renderer->GetRenderWindow()->MakeCurrent();
    
    if(!m_initialized)
    {
      RenderingManager::GetInstance()->ForceImmediateUpdate(m_renderer->GetRenderWindow());
      m_initialized = InitGenerator();
    }
    if (!m_initialized) 
    {
      TerminateGenerator();
      return false;
    }
    int imgSize = 3 * m_width * m_height;
    GLbyte *data = new GLbyte[imgSize];
    
    RenderingManager::GetInstance()->ForceImmediateUpdate(m_renderer->GetRenderWindow());
    glReadPixels( 5, 5, m_width, m_height, GL_BGR, GL_UNSIGNED_BYTE, (void*)data );
    AddFrame( data );    
    delete[] data;  
  }
  return true;
}
/*=================================================================*/
void NewSeeds( int consume ) {
IntArrayPtr  shuffle;
int   i, temp, g, ndx ;
   shuffle = new int[NumberOfGenerators+1];
   g = consume % NumberOfGenerators ;
   AdvanceState( g, consume ) ;
    for ( i = 1 ; i <= NumberOfGenerators - 1; i++ ) {
	  shuffle[i] = BddRandom( g, i + 1, NumberOfGenerators + 1 ) ;
   } ;
    for ( i = 1 ; i <=  NumberOfGenerators - 1 ; i++ ) {
	  ndx = shuffle[i] ;
	  temp = Ig1[ndx] ;
	  Ig1[ndx] = Ig1[i] ;
	  Ig1[i] = temp ;
	  temp = Ig2[ndx] ;
	  Ig2[ndx] = Ig2[i] ;
	  Ig2[i] = temp ;
      InitGenerator( i, InitialSeed ); 
   } ;
   InitGenerator( NumberOfGenerators, InitialSeed ) ;
   delete(shuffle);
};
bool mitk::MovieGenerator::WriteMovie()
{  
  bool ok = false;
  if (m_stepper)
  {
    if (m_renderer) m_renderer->GetRenderWindow()->MakeCurrent();
    //m_stepper->First();
    RenderingManager::GetInstance()->ForceImmediateUpdate(m_renderer->GetRenderWindow());

    ok = InitGenerator();
    if (!ok) 
    {
      TerminateGenerator();
      return false;
    }
    int imgSize = 3 * m_width * m_height;
    printf( "Video size = %i x %i\n", m_width, m_height );
    GLbyte *data = new GLbyte[imgSize];

    //duplicate steps if pingPong option is switched to on.
    unsigned int numOfSteps = m_stepper->GetSteps();
    if( m_stepper->GetPingPong() )
      numOfSteps*=2;

    for (unsigned int i=0; i<numOfSteps; i++)
    {
      if (m_renderer) m_renderer->GetRenderWindow()->MakeCurrent();
      RenderingManager::GetInstance()->ForceImmediateUpdate(m_renderer->GetRenderWindow());
      glReadPixels( 5, 5, m_width, m_height, GL_BGR, GL_UNSIGNED_BYTE, (void*)data );
      AddFrame( data );
      m_stepper->Next();
    }
    ok = TerminateGenerator();
    delete[] data;
  }
  return ok;
}
/*=================================================================*/
void ResetGenerators( SeedType Where ){
    for (int g = 1;g <= NumberOfGenerators; g++) InitGenerator(g,Where);
};
/*=================================================================*/
void SetSeed( int g , int S1, int S2 ) {
   Ig1[g] = S1;  Ig2[g] = S2;
   InitGenerator( g, InitialSeed );
};