/* (c) 1999-2000 Tino Schwarze, see COPYING for details */
/**@pkg cObject.cVisibleObject.cInteractiveObject.cCube*/
/**
 * cube derived from class cInteractiveObject
 *
 * #include "cCube.hh"
 * -lglut
 *
 * @see cInteractiveObject
 * @pkgdoc cObject.cVisibleObject.cInteractiveObject.cCube
 */

#ifndef cCube_hh
#define cCube_hh

#include "cInteractiveObject.hh"

/**
 * Simple cube object.
 	*
	* This object displays a simple cube, either solid or wireframed.
	* glutSolidCube() or glutWireCube() is used to build it.
	* Further, a display list is used to draw the cube.
	*/
class cCube 
:	public cInteractiveObject
{
// LIFECYCLE
public:
	/**
	 * an enum to describe the cube's type (solid or wireframed)
	 	*/
	typedef enum eCubeType {
		CUBE_SOLID,
		CUBE_WIREFRAMED
	} teCubeType;

	/**
	 * default constructor w/ optional object name
	 	* @param name name of object (optional)
	 	*/
	cCube (
		cEventDispatcher *disp,
		const char *name = NULL);

	/**
	 * constructor w/ optional size and object name
	 	* @param size (GLdouble) side length of cube (default: 1.0)
	 	* @param name name of object (optional)
	 	*/
	cCube (
		cEventDispatcher *disp,
		GLdouble size = 1.0, 
		const char *name = NULL);

	/**
	 * default constructor
	 	* @param size (GLdouble) side length of cube
	 	* @param solid (GLboolean) draw solid or wireframe cube (default: solid)
		* @param name name of object (optional)
	 	*/
	cCube (
		cEventDispatcher *disp,
		GLdouble size = 1.0, 
		teCubeType solid = CUBE_SOLID,
		const char *name = NULL);

	/**
	 * default constructor
	 	* @param size (GLdouble) side length of cube
	 	* @param solid (GLboolean) draw solid or wireframe cube (default: solid)
		* @param resolution subdivisions per side
		* @param name name of object (optional)
	 	*/
	cCube (
		cEventDispatcher *disp,
		GLdouble size, 
		teCubeType solid,
		int resolution,
		const char *name = NULL);

	/**
	 * destructor
	 	*/
	virtual ~cCube ();

	/**
	 * initialization function
	 	*/
	virtual int Init ();


protected:	
	/**
	 * drawing function
	 	*/
	virtual void DrawThisObject ();

	/**
	 * return class name
	 	*/
	virtual const char *GetDefaultName () const
	{
		return "cCube";
	}

	/**
	 * create solid cube at given resolution
	 	*/
	void MakeSolidCube ();

	
	/**
	 * create wire framed cube at given resolution
	 	*/
	void MakeWireCube ();

// I don't want to make this private since a cTexturedCube might
// want to access this!

	/** ID of display list which contains the cube */
	GLuint mDisplayList;

	/** Is the cube solid or wireframed? */
	teCubeType mSolid;

	/** side length of cube */
	GLdouble mSize;

	/** resolution of cube, if given */
	int mResolution;
};

#endif	// ifndef cCube_hh

