// nUtil - An utility Library for gnurbs
// Copyright (C) 2008-2026 Eric Bechet
//
// See the LICENSE file for contributions and license information.
// Please report all bugs and problems to <bechet@cadxfem.org>.
//

#include "ndata.h"

data_container::data_container(void)
{ 
  setcolorpoints(color());
  setcolorlines(color());
  setcolortriangles(color());
  setcolorquads(color());
}

void data_container::clear(void)
{
  points.clear();
  lines.clear();
  triangles.clear();
  quads.clear();
  proppoints.clear();
  proplines.clear();
  proptriangles.clear();
  propquads.clear();
  setcolorpoints(color());
  setcolorlines(color());
  setcolortriangles(color());
  setcolorquads(color());
}

const color& data_container::getcolorpoints(int i) const 
{ 
  return proppoints[i].first.c;
}

const color& data_container::getcolorlines(int i) const
{
  return proplines[i].first.c;
}

const color& data_container::getcolortriangles(int i) const
{
  return proptriangles[i].first.c;
}

const color& data_container::getcolorquads(int i) const
{
  return propquads[i].first.c;
}

const properties& data_container::getproppoints(int i) const 
{ 
  return proppoints[i].first;
}

const properties& data_container::getproplines(int i) const
{
  return proplines[i].first;
}

const properties& data_container::getproptriangles(int i) const
{
  return proptriangles[i].first;
}

const properties& data_container::getpropquads(int i) const
{
  return propquads[i].first;
}


const properties data_container::getproppoints() const 
{ 
  if (getnumproppoints()!=0)
  return proppoints[getnumproppoints()-1].first;
  else
    return properties();
}

const properties data_container::getproplines() const
{
  if (getnumproplines()!=0)
  return proplines[getnumproplines()-1].first;
  else
    return properties();
}

const properties data_container::getproptriangles() const
{
  if (getnumproptriangles()!=0)
  return proptriangles[getnumproptriangles()-1].first;
  else
    return properties();
}

const properties data_container::getpropquads() const
{
  if (getnumpropquads()!=0)
  return propquads[getnumpropquads()-1].first;
  else
    return properties();
}




int data_container::getindexpoints(int i) const 
{ 
  return proppoints[i].second;
}

int data_container::getindexlines(int i) const
{
  return proplines[i].second;
}

int data_container::getindextriangles(int i) const
{
  return proptriangles[i].second;
}

int data_container::getindexquads(int i) const
{
  return propquads[i].second;
}

int data_container::getnumproppoints(void) const
{
  return proppoints.size();
}

int data_container::getnumproplines(void) const
{
  return proplines.size();
}

int data_container::getnumproptriangles(void) const
{
  return proptriangles.size(); 
}

int data_container::getnumpropquads(void) const
{
  return propquads.size();
}

void data_container::setcolorpoints(color c)
{
  properties p=getproppoints();
  p.c=c;
  setproppoints(p);
}

void data_container::setcolorlines(color c)
{
  properties p=getproplines();
  p.c=c;
  setproplines(p);
}

void data_container::setcolortriangles(color c)
{
  properties p=getproptriangles();
  p.c=c;
  setproptriangles(p);
}

void data_container::setcolorquads(color c)
{
  properties p=getpropquads();
  p.c=c;
  setpropquads(p);
}

void data_container::setproppoints(properties p)
{
  proppoints.push_back(std::make_pair(p,points.size()));
}

void data_container::setproplines(properties p)
{
  proplines.push_back(std::make_pair(p,lines.size()));
}


void data_container::setproptriangles(properties p)
{
  proptriangles.push_back(std::make_pair(p,triangles.size()));
}

void data_container::setpropquads(properties p)
{
  propquads.push_back(std::make_pair(p,quads.size()));
}

void data_container::add_point(const point& src)
{
  points.push_back(src);
}

void data_container::add_point(const npoint3& src)
{
  point p;p.pts=src;
  points.push_back(p);
}

void data_container::add_line(const line& src)
{
  lines.push_back(src);
}

void data_container::add_triangle(const triangle& src)
{
  triangles.push_back(src);
}
void data_container::add_quad(const quad& src)
{
  quads.push_back(src);
}

void data_container::add_text(int num,const std::pair<point,color>& src)
{
  texts[num].push_back(src);
}
int data_container::nb_points(void) const
{
  return points.size();
}

int data_container::nb_lines(void) const
{
  return lines.size();
}

int data_container::nb_triangles(void) const
{
  return triangles.size();
}

int data_container::nb_quads(void) const
{
  return quads.size();
}

int data_container::nb_texts(int num) const
{
  return texts[num].size();
}

const point& data_container::get_point(int i) const
{
  return points[i];
}

const line& data_container::get_line(int i) const
{
  return lines[i];
}

const triangle& data_container::get_triangle(int i) const
{
  return triangles[i];
}

const quad& data_container::get_quad(int i) const
{
  return quads[i];
}
const point& data_container::get_text(int num,int i) const
{
  return texts[num][i].first;
}
const color& data_container::get_text_color(int num,int i) const
{
  return texts[num][i].second;
}
