/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */

#include "Engine/StdH.h"

#include <Engine/Terrain/Terrain.h>
#include <Engine/Terrain/TerrainArchive.h>
#include <Engine/World/WorldEditingProfile.h>
#include <Engine/World/World.h>
#include <Engine/Math/Float.h>
#include <Engine/Base/ProgressHook.h>
#include <Engine/Base/Stream.h>
#include <Engine/Entities/Entity.h>
#include <Engine/Base/ListIterator.inl>

#include <Engine/Templates/DynamicArray.cpp>
#include <Engine/Templates/StaticArray.cpp>

template class CDynamicArray<CBrush3D>;

/*
 * Read from stream.
 */
void CTerrainArchive::Read_t( CTStream *istrFile) // throw char *
{
  istrFile->ExpectID_t("TRAR");   // terrain archive

  INDEX ctTerrains;
  // read number of terrains
  (*istrFile)>>ctTerrains;

  // if there are some terrains
  if (ctTerrains!=0) {
    // create that much terrains
    CTerrain *atrBrushes = ta_atrTerrains.New(ctTerrains);
    // for each of the new terrains
    for (INDEX iTerrain=0; iTerrain<ctTerrains; iTerrain++) {
      // read it from stream
      CallProgressHook_t(FLOAT(iTerrain)/ctTerrains);
      ta_atrTerrains[iTerrain].Read_t(istrFile);
    }
  }

  istrFile->ExpectID_t("EOTA");   // end of terrain archive
}

/*
 * Write to stream.
 */
void CTerrainArchive::Write_t( CTStream *ostrFile) // throw char *
{
  ostrFile->WriteID_t("TRAR");   // terrain archive

  // write the number of terrains
  (*ostrFile)<<ta_atrTerrains.Count();
  // for each of the terrains
  FOREACHINDYNAMICARRAY(ta_atrTerrains, CTerrain, ittr) {
    // write it to stream
    ittr->Write_t(ostrFile);
  }

  ostrFile->WriteID_t("EOTA");   // end of terrain archive
}