/// This file is part of the X3DToolKit library
/// Copyright (C) 2002-2004  Yannick Le Goc (legoc@imag.fr)

/// http://artis.imag.fr/Members/Yannick.Legoc/X3D/

/// This library is free software; you can redistribute it and/or
/// modify it under the terms of the GNU Lesser General Public
/// License as published by the Free Software Foundation; either
/// version 2.1 of the License, or (at your option) any later version.

/// This library is distributed in the hope that it will be useful,
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
/// Lesser General Public License for more details.

/// You should have received a copy of the GNU Lesser General Public
/// License along with this library; if not, write to the Free Software
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#ifndef X3DTK_GL_CONE_H
#define X3DTK_GL_CONE_H

#include "GL_X3DGeometryNode.h"

namespace X3DTK {
namespace GL {

class ConeDrawArray;

/*! \brief Class declared in <b><X3DTK/GL/scenegraph.h></b> providing the GL implementation
 *  of X3D::Cone.
 *
 *  \ingroup GLSceneGraph
 */
 
class Cone : public X3DGeometryNode
{
public:
  /// Constructor.
  Cone();
  /// Destructor.
  virtual ~Cone();

  /// Sets the bottom radius attribute.
  void setBottomRadius(const SFFloat &bottomRadius);
  /// Sets the height attribute.
  void setHeight(const SFFloat &height);
  /// Sets the side attribute.
  void setSide(const SFBool &side);
  /// Sets the bottom attribute.
  void setBottom(const SFBool &bottom);
  /// Sets the cone array.
  void setConeArray(ConeDrawArray *coneArray);

  /// Gets the bottom radius attribute.
  inline const SFFloat &getBottomRadius() const {return _bottomRadius;};
  /// Gets the height attribute.
  inline const SFFloat &getHeight() const {return _height;};
  /// Gets the side attribute.
  inline const SFBool &getSide() const {return _side;};
  /// Gets the bottom attribute.
  inline const SFBool &getBottom() const {return _bottom;};
  /// Gets the cone array.
  inline ConeDrawArray *getConeArray() const {return _coneArray;};

  /// Updates the attributes of the node.
  virtual void update();
  /// Renders the node in an openGL context.
  virtual void draw() const;  

private:  
  /// Bottom radius attribute.
  SFFloat _bottomRadius;
  /// Height attribute.
  SFFloat _height;
  /// Side attribute.
  SFBool _side;
  /// Bottom attribute.
  SFBool _bottom;
  /// Cone array.
  ConeDrawArray *_coneArray;
};

}
}

#endif
