#pragma once
#include "nutil.h"
#include "ndisplay.h"
#include <unordered_set>
#include "fileIO.h"

struct data_env
{
  stlmesh_nn mesh;
  std::vector<data_container> buffer;
  std::vector<std::pair<npoint3,npoint3> >  ref_scanbodies;
  std::vector<std::pair<npoint3,npoint3> >  scanbodies;
  double sbh;
  ndisplay *display;
  std::string STLname;
  std::string RSBname;
  std::string SBname;
  bool bulk_select;
  bool edgeon;
  void init_display() {display=new ndisplay;}
  data_env():buffer(3),bulk_select(true),edgeon(false),display(0) {}
  ~data_env() {if (display) delete(display); }
};

void drawsb(data_env* current);
void compare(std::vector<std::pair<npoint3,npoint3> > &sb, std::vector<std::pair<npoint3,npoint3> > &sbr, std::stringstream &buffer);

#ifdef INTERFACE_TYPE_FLTK
struct Fl_Menu_Item;
extern const Fl_Menu_Item custom_menu_items[];
#endif

class mycallbacks : public ncallbacks
{
//  std::vector<npoint3> pts;
  std::unordered_set<npoint3> pts;
  npoint3 normalc;
  npoint3 normalp;
  npoint3 basec;
  npoint3 basep;
  bool donec;
  bool donep;
  npoint3 center;
  npoint3 normal;
  data_env  &env;
public:
  mycallbacks(data_env &env_):donec(false),donep(false),env(env_){}
  virtual int pick_callback(int,pickinfo[],npoint3);
  virtual int key_callback(int key, const char* str);
};
