//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

#ifndef STOCKSOLIDS_H
#define STOCKSOLIDS_H
#ifdef _WIN32
#pragma once
#endif

#pragma warning(push, 1)
#pragma warning(disable:4701 4702 4530)
#include <fstream>
#pragma warning(pop)
#include "mathlib/vector.h"
#include "MapFace.h"


class BoundBox;
class CMapSolid;
class Vector;


class StockSolid
{
	public:
		void Serialize(std::fstream& file, BOOL bIsStoring);
		int GetFieldCount() const;
		void SetFieldData(int iIndex, int iData);
		int GetFieldData(int iIndex, int *piData = NULL) const;
		void GetFieldRange(int iIndex, int *piRangeLower, int *piRangeUpper);
		void SetOrigin(const Vector &o);
		void SetCenterOffset(const Vector &ofs);
		
		virtual void SetFromBox(BoundBox * pBox) {}

		virtual void CreateMapSolid(CMapSolid *pSolid, TextureAlignment_t eAlignment) = 0;

		~StockSolid();

	protected:
		StockSolid(int nFields);

		typedef enum
		{
			DFTYPE_INTEGER,
			DFTYPE_BOOLEAN
		} STSDF_TYPE;

		void AddDataField(STSDF_TYPE type, const char *pszName, int iRangeLower = -1,
			int iRangeUpper = -1);

		Vector origin;
		Vector cofs;

	private:
		void AllocateDataFields(int nFields);

		enum
		{
			DFFLAG_RANGED = 0x01
		};

		typedef struct
		{
			unsigned flags;
			STSDF_TYPE type;
			char szName[128];

		// range:
			int iRangeLower;
			int iRangeUpper;

		// value:
			int iValue;

		} STSDATAFIELD;

		STSDATAFIELD *pFields;
		int nFields;
		int iMaxFields;
};


class StockBlock : public StockSolid
{
	public:

		StockBlock();

		void CreateMapSolid(CMapSolid *pSolid, TextureAlignment_t eTextureAlignment);
		void SetFromBox(BoundBox *pBox);

		enum { fieldWidth, fieldDepth, fieldHeight };
};


class StockWedge : public StockSolid
{
	public:

		StockWedge();

		void CreateMapSolid(CMapSolid *pSolid, TextureAlignment_t eTextureAlignment);
		void SetFromBox(BoundBox *pBox);

		enum { fieldWidth, fieldDepth, fieldHeight };
};


class StockCylinder : public StockSolid
{
	public:

		StockCylinder();

		void CreateMapSolid(CMapSolid *pSolid, TextureAlignment_t eTextureAlignment);
		void SetFromBox(BoundBox *pBox);

		enum { fieldWidth, fieldDepth, fieldHeight, fieldSideCount };
};


class StockSpike : public StockSolid
{
	public:

		StockSpike();

		void CreateMapSolid(CMapSolid *pSolid, TextureAlignment_t eTextureAlignment);
		void SetFromBox(BoundBox *pBox);

		enum { fieldWidth, fieldDepth, fieldHeight, fieldSideCount };
};


class StockSphere : public StockSolid
{
	public:

		StockSphere();

		void CreateMapSolid(CMapSolid *pSolid, TextureAlignment_t eTextureAlignment);
		void SetFromBox(BoundBox *pBox);

		enum { fieldWidth, fieldDepth, fieldHeight, fieldSideCount };
};


#endif // STOCKSOLIDS_H