#ifndef MATERIALSYSTEMUTIL_H
#define MATERIALSYSTEMUTIL_H

#ifdef _WIN32
#pragma once
#endif

#include "imageformat.h"   
#include "imaterialsystem.h"      

class IMaterial;
class ITexture;
class KeyValues;

class KeyValues;


class CMaterialReference
{
public:
	CMaterialReference(char const* pMaterialName = 0, const char* pTextureGroupName = 0, bool bComplain = true);
	~CMaterialReference();

	void Init(const char* pMaterialName, const char* pTextureGroupName, bool bComplain = true);
	void Init(const char* pMaterialName, KeyValues* pVMTKeyValues);
	void Init(IMaterial* pMaterial);
	void Init(CMaterialReference& ref);
	void Init(const char* pMaterialName, const char* pTextureGroupName, KeyValues* pVMTKeyValues);

	void Shutdown();
	bool IsValid() { return m_pMaterial != 0; }

	operator IMaterial* () { return m_pMaterial; }
	operator IMaterial* () const { return m_pMaterial; }
	operator IMaterial const* () const { return m_pMaterial; }
	IMaterial* operator->() { return m_pMaterial; }

private:
	IMaterial* m_pMaterial;
};

class CTextureReference
{
public:
	CTextureReference();
	CTextureReference(const CTextureReference& ref);
	~CTextureReference();

	void Init(char const* pTexture, const char* pTextureGroupName, bool bComplain = true);
	void InitProceduralTexture(const char* pTextureName, const char* pTextureGroupName, int w, int h, ImageFormat fmt, int nFlags);
	void InitRenderTarget(int w, int h, RenderTargetSizeMode_t sizeMode, ImageFormat fmt, MaterialRenderTargetDepth_t depth, bool bHDR, char* pStrOptionalName = NULL);
#if defined( _X360 )
	void InitRenderTargetTexture(int width, int height, RenderTargetSizeMode_t sizeMode, ImageFormat fmt, MaterialRenderTargetDepth_t depth, bool bHDR, char* pStrOptionalName = NULL);
	void InitRenderTargetSurface(int width, int height, ImageFormat fmt, bool bSameAsTexture);
#endif
	void Init(ITexture* pTexture);

	void Shutdown(bool bDeleteIfUnReferenced = false);
	bool IsValid() { return m_pTexture != 0; }

	operator ITexture* () { return m_pTexture; }
	operator ITexture const* () const { return m_pTexture; }
	ITexture* operator->() { return m_pTexture; }

	void operator=(CTextureReference& ref);

private:
	ITexture* m_pTexture;
};


#endif  