
///////////////////////////////////////////////////////////////////////////////
//
// File   : Asura_Resource_System.cpp
// Author : Andy Tate
// Date   : 20-Jun-2008
//
// Copyright (C) 2008 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include "Core/Asura.h"

// This file's header...
#include "Core/Resources/Asura_Resource_System.h"
#include "Core/Resources/Asura_ResourceSet.h"

// Asura independent header-files...


////////////////////////////////////////////////////////////////////////////////
// Constant declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Static variable declarations...
////////////////////////////////////////////////////////////////////////////////

Asura_Hash_ID									Asura_Resource_System::s_uCurrentResourceBank		= ASURA_HASH_ID_UNSET;
Asura_Resource_System::ResourceBankContainer*	Asura_Resource_System::s_pxResourceBankContainer	= NULL;
Asura_Resource_System::ResourceSetContainer*	Asura_Resource_System::s_pxResourceSetContainer		= NULL;


////////////////////////////////////////////////////////////////////////////////
// Private functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Protected functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Public functions...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_Resource_System::Initialise
// Author       : Andy Tate
// Date         : 20-Jun-2008
////////////////////////////////////////////////////////////////////////////////

void Asura_Resource_System::Initialise(void)
{
	CreateResourceBank(uASURA_RESOURCE_BANK_HASH_PERMANENT, szASURA_RESOURCE_BANK_NAME_PERMANENT, uASURA_RESOURCE_BANK_TRG_PERMANENT);
}

/// End of function 'Asura_Resource_System::Initialise'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_Resource_System::Shutdown
// Author       : Andy Tate
// Date         : 20-Jun-2008
////////////////////////////////////////////////////////////////////////////////

void Asura_Resource_System::Shutdown(void)
{
	delete(s_pxResourceBankContainer);
	delete(s_pxResourceSetContainer);

	s_uCurrentResourceBank		= ASURA_HASH_ID_UNSET;
	s_pxResourceBankContainer	= NULL;
	s_pxResourceSetContainer	= NULL;
}

/// End of function 'Asura_Resource_System::Shutdown'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_Resource_System::CreateResourceBank
// Author       : Andy Tate
// Date         : 20-Jun-2008
////////////////////////////////////////////////////////////////////////////////

bool Asura_Resource_System::CreateResourceBank(const Asura_Hash_ID uBankHash,
											   const char* szBankName,
											   const u_int uTextureResetGroup)
{
	// Ensure that we have a container for resource-banks, this is necessary because
	// resource-sets can be created from static initialisation...
	if(s_pxResourceBankContainer == NULL)
	{
		s_pxResourceBankContainer	= new ResourceBankContainer;
	}

	// Ensure that we have created the container...
	if(s_pxResourceBankContainer == NULL)
	{
		Asura_Assert(false, "Failed to create resource-bank container - something bad has happened.");
		return(false);
	}
	else
	{
		Asura_ResourceBank*	pxBank	= s_pxResourceBankContainer->AddNode(uBankHash);

		if(pxBank == NULL)
		{
			return(false);
		}
		else
		{
			s_uCurrentResourceBank	= uBankHash;

			pxBank->Initialise(uBankHash, szBankName, uTextureResetGroup);
			return(true);
		}
	}
}

/// End of function 'Asura_Resource_System::CreateResourceBank'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_Resource_System::DestroyResourceBank
// Author       : Andy Tate
// Date         : 20-Jun-2008
////////////////////////////////////////////////////////////////////////////////

bool Asura_Resource_System::DestroyResourceBank(const Asura_Hash_ID uBankHash)
{
	if((s_pxResourceBankContainer != NULL) && s_pxResourceBankContainer->DeleteNodeByHash(uBankHash))
	{
		if(s_pxResourceSetContainer != NULL)
		{
			// Remove all of the resources in this bank from each resource-set in-turn...
			for(ResourceSetIterator xIterator(*s_pxResourceSetContainer); !xIterator.Done(); xIterator.Next())
			{
				Asura_ResourceSet_Base**	ppxResourceSet	= xIterator.GetCurrent();
				Asura_ResourceSet_Base*		pxResourceSet	= (ppxResourceSet == NULL) ? NULL : *ppxResourceSet;

				if(pxResourceSet != NULL)
				{
					pxResourceSet->ResetBank(uBankHash);
				}
			}
		}

		return(true);
	}
	else
	{
		return(false);
	}
}

/// End of function 'Asura_Resource_System::DestroyResourceBank'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_Resource_System::AddResourceSet
// Author       : Andy Tate
// Date         : 22-Aug-2008
////////////////////////////////////////////////////////////////////////////////

bool Asura_Resource_System::AddResourceSet(Asura_ResourceSet_Base& xResourceSet)
{
	if(s_pxResourceSetContainer == NULL)
	{
		s_pxResourceSetContainer	= new ResourceSetContainer;
	}

	if(s_pxResourceSetContainer == NULL)
	{
		Asura_Assert(false, "Failed to create resource-set container - something bad has happened.");
		return(false);
	}
	else
	{
		const Asura_Hash_ID			uSetHash	= xResourceSet.GetHash();
		Asura_ResourceSet_Base**	ppxSet		= s_pxResourceSetContainer->AddNode(uSetHash);

		if(ppxSet == NULL)
		{
			return(false);
		}
		else
		{
			*ppxSet	= &xResourceSet;
			return(true);
		}
	}
}

/// End of function 'Asura_Resource_System::AddResourceSet'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_Resource_System::RemoveResourceSet
// Author       : Andy Tate
// Date         : 22-Aug-2008
////////////////////////////////////////////////////////////////////////////////

bool Asura_Resource_System::RemoveResourceSet(Asura_ResourceSet_Base& xResourceSet)
{
	if(s_pxResourceSetContainer == NULL)
	{
		return(false);
	}
	else
	{
		const Asura_Hash_ID	uSetHash	= xResourceSet.GetHash();

		return(s_pxResourceSetContainer->DeleteNodeByHash(uSetHash));
	}
}

/// End of function 'Asura_Resource_System::RemoveResourceSet'. ///


/// End of file. ///
