//
//  Vrml 97 library
//  Copyright (C) 1998 Chris Morley
//
//  %W% %G%
//  VrmlNodeCylinder.cpp

#include "VrmlNodeCylinder.h"

#include "VrmlNodeType.h"
#include "Viewer.h"


//  Return a new VrmlNodeCylinder
static VrmlNode *creator( VrmlScene *s ) { return new VrmlNodeCylinder(s); }


// Define the built in VrmlNodeType:: "Cylinder" fields

VrmlNodeType *VrmlNodeCylinder::defineType(VrmlNodeType *t)
{
  static VrmlNodeType *st = 0;

  if (! t)
    {
      if (st) return st;
      t = st = new VrmlNodeType("Cylinder", creator);
    }

  VrmlNodeGeometry::defineType(t);	// Parent class
  t->addField("bottom", VrmlField::SFBOOL);
  t->addField("height", VrmlField::SFFLOAT);
  t->addField("radius", VrmlField::SFFLOAT);
  t->addField("side", VrmlField::SFBOOL);
  t->addField("top", VrmlField::SFBOOL);

  return t;
}


VrmlNodeType *VrmlNodeCylinder::nodeType() const { return defineType(0); }


VrmlNodeCylinder::VrmlNodeCylinder(VrmlScene *scene) :
  VrmlNodeGeometry(scene),
  d_bottom(true),
  d_height(2.0),
  d_radius(1.0),
  d_side(true),
  d_top(true)
{
}

VrmlNodeCylinder::~VrmlNodeCylinder()
{
  // need access to viewer to remove d_viewerObject...
}


VrmlNode *VrmlNodeCylinder::cloneMe() const
{
  return new VrmlNodeCylinder(*this);
}


ostream& VrmlNodeCylinder::printFields(ostream& os, int indent)
{
  if (! d_bottom.get()) PRINT_FIELD(bottom);
  if (! d_side.get()) PRINT_FIELD(side);
  if (! d_top.get()) PRINT_FIELD(top);
  if (d_height.get() != 2.0) PRINT_FIELD(height);
  if (d_radius.get() != 1.0) PRINT_FIELD(radius);

  return os;
}


Viewer::Object VrmlNodeCylinder::insertGeometry(Viewer *viewer)
{
  return viewer->insertCylinder(d_height.get(),
				d_radius.get(),
				d_bottom.get(),
				d_side.get(),
				d_top.get());
}

// Set the value of one of the node fields.

void VrmlNodeCylinder::setField(const char *fieldName,
				const VrmlField &fieldValue)
{
  if TRY_FIELD(bottom, SFBool)
  else if TRY_FIELD(height, SFFloat)
  else if TRY_FIELD(radius, SFFloat)
  else if TRY_FIELD(side, SFBool)
  else if TRY_FIELD(top, SFBool)
  else
    VrmlNodeGeometry::setField(fieldName, fieldValue);
}

VrmlNodeCylinder* VrmlNodeCylinder::toCylinder() const //LarryD Mar 08/99
{ return (VrmlNodeCylinder*) this; }
