#pragma once
#define MLR_MLRPOINTCLOUD_HPP

#if !defined(MLR_MLR_HPP)
	#include <MLR\MLR.hpp>
#endif

#if !defined(MLR_MLREFFECT_HPP)
	#include <MLR\MLREffect.hpp>
#endif

namespace MidLevelRenderer {

	//##########################################################################
	//#######################    MLRPointCloud    ##############################
	//##########################################################################


	class MLRPointCloud:
		public MLREffect
	{
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Initialization
	//
	public:
		static void
			InitializeClass();
		static void
			TerminateClass();

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Constructors/Destructors
	//
	public:
		MLRPointCloud(int, int=0);
		~MLRPointCloud();

		void
			SetData(
				const int *count,
				const Stuff::Point3D *point_data,
				const Stuff::RGBAColor *color_data
			);
		virtual int
			GetType(int) { return type; }

		void Draw (DrawEffectInformation*, GOSVertexPool*, MLRSorter*);
		int Draw (ToBeDrawnPrimitive*, MLRSorter*);

		void Transform(int, int);

		int	Clip(MLRClippingState, GOSVertexPool*, bool);		

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Class Data Support
	//
	public:
		static ClassData
			*DefaultData;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Testing
	//
	public:
		void
			TestInstance() const;

	protected:
		int type;
		const int *usedNrOfVertices;
	};

}
