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

#pragma once

#include "glmSDKAPI.h"
#include "glmNavigationMesh3CreatorParameters.h"
#include "glmRoadmapCreatorParameters.h"

#include <Recast.h>

namespace glm
{
	/**
	* \brief Compute Spatial Environment functor parameters
	*
	* \ingroup SpatialEnvironment
	*
	* \author Golaem <dev@golaem.com>
	*/
	class GLM_SDK_API VoxelSpatialEnvironmentCreatorParameters
	{
	public:
		/**
		* \brief default constructor
		*/
		VoxelSpatialEnvironmentCreatorParameters();

		/**
		* \brief destructor
		*/
		~VoxelSpatialEnvironmentCreatorParameters();

		/**
		* \name Minimum Radius
		* \brief Among agents that will use the generated navigation mesh, the minium of their radii.
		*/
		//@{
		float getMinimumRadius() const;
		void setMinimumRadius(float minimumRadius);
		//@}

		/**
		* \name MaximumStepHeight
		* \brief Among agents that will use the generated navigation mesh, the maximum step heigth they can navigate.
		*/
		//@{
		float getMaximumStepHeight() const;
		void setMaximumStepHeight(float maximumStepHeight);
		//@}

		/**
		* \name MinimumConnexZoneSurface
		* \brief The minimum surface for a connex navigable zone to be considered.
		*/
		//@{
		float getMinimumConnexZoneSurface() const;
		void setMinimumConnexZoneSurface(float minimumConnexZoneSurface);
		//@}

		/**
		* \name KeepingOnlyGreatestConnexZone
		* \brief Boolean telling if only the greatest connex navigable is to be considered
		*/
		//@{
		bool isKeepingOnlyGreatestConnexZone() const;
		void setKeepingOnlyGreatestConnexZone(bool keepingOnlyGreatestConnexZone);
		//@}

		unsigned int _computationThreadsCount;
		/**
		* \brief configuration to use for Recast builds.
		*/
		rcConfig _recastConfig;

		/**
		* \name DoubleSidedGeometry
		* \brief True if the geometry is considered double sided ()
		*
		* Default value is true.
		*/
		bool _doubleSidedGeometry;

		NavigationMesh3CreatorParameters _navigationMesh3CreatorParameters;
		RoadmapCreatorParameters _roadmapCreatorParameters;
	};

}
