#include "gmshLevelset.h"
#include "CompositeTextile.h"
#define FILS     15
#define TEXTIL  16

class gLevelsetFils;
class gLevelsetTextile;

class gLevelsetFils : public gLevelsetPrimitive
{
protected:
  int _numBucket;
  gLevelsetTextile* _lsTisse;

public:
  gLevelsetFils (gLevelsetTextile* lsTisse, int numBucket, int tag) : gLevelsetPrimitive(tag) {_lsTisse=lsTisse; _numBucket=numBucket;}
  gLevelsetFils(const gLevelsetFils & lv) : gLevelsetPrimitive(lv), _numBucket(lv._numBucket), _lsTisse(lv._lsTisse)  {}
  virtual ~gLevelsetFils() {}
  
  double operator () (const double x, const double y, const double z) const;
  int type() const {return FILS;}

  void cleanLsFiles(); // A compléter afin de supprimer aussi lsTisse en dernier
};

class gLevelsetTextile : public gLevelsetPrimitive
{
protected:
  Tisse _tisse;
  std::vector<gLevelsetFils*> _lsFils;

public:
  gLevelsetTextile (const double &epaisseur, const double &dimChaine, const double &dimTrame,
                   const std::vector<double> &axesChaine, const std::vector<double> &axesTrame,
                   const int &layer, const fullMatrix<int> &structure, const std::vector<int> &multipliciteChaine,
                   const int &nbdx, const int &nbdyz,
                   int &tag);
  gLevelsetTextile(const gLevelsetTextile & lv) : gLevelsetPrimitive(lv), _tisse(lv._tisse), _lsFils(lv._lsFils) {}
  virtual ~gLevelsetTextile() {}

  Tisse* getTisse() {return &_tisse;}
  int getNbLsFils() const {return _lsFils.size();}
  gLevelsetFils* getLsFil(int i) {return _lsFils[i];}
  
  double operator () (const double x, const double y, const double z) const {return 1;};
  int type() const {return TEXTIL;}
};