/***************************************************************************
*                                                                          *
*  Copyright (C) Golaem S.A.  All Rights Reserved.                         *
*                                                                          *
***************************************************************************/

#pragma once

#include "glmVector3.h"
#include "glmSmartPointer.h"

namespace glm
{
	/**
	* \brief Abstract class defining a volume.
	*
	* \ingroup geometry3
	* \author Golaem <dev@golaem.com>
	*
	* \param float Manipulated scalar type (\ref Expression, double, float...)
	*/
	class GLM_CORE_API Volume
	{
	public:

		GLM_ABSTRACTCLASS_STAT_ID( glm::MemoryStatIds::GolaemShared)

			/**
			* \brief Virtual destructor.
			*/
			virtual ~Volume()
		{}

		/**
		* \brief Check if a point is contained in the volume.
		*/
		virtual bool contains(const Vector3 & point, float precision = GLM_NUMERICAL_PRECISION) const = 0;

		/**
		* \brief Retrieve the axis aligned bounding box of the volume.
		* \param[out] min The lower bound of the box.
		* \param[out] max The upper bound of the box.
		*/
		virtual void retrieveBoundingBox(Vector3 & min, Vector3 & max) const = 0;

		/**
		* \brief Clone the instance
		*/
		virtual Volume* clone() const = 0;
	};
}

