/*
 =======================================================================================
  Name        : TPGMyDoc.cpp
  Author      : David Reizer
  Description : Document class for Particle Generator editor Tool DLL
 =======================================================================================
  Modification -> Author : Vincent Lhullier
 =======================================================================================
 */

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "StdAfx.h"

#include "SCR.h"
#include "CTL.h"

#include "TPGMyDoc.hpp"
#include "TPG_View.hpp"
#include "TPG_Strg.hpp"
#include "TPG_ClBk.hpp"

#include "_Minterf.hpp"

#include "x:\cpa\main\inc\_EditID.h"

#include "ErO.h"
#include "Dpt.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/*
 =======================================================================================
	CPA_PartGen_MyDocument class	 
 =======================================================================================
 */

/*
 ----------------------------------------------------------------------------------------
  Description   :  constructor
 ----------------------------------------------------------------------------------------
 */
CPA_PartGen_MyDocument::CPA_PartGen_MyDocument()
{
//	AfxEnableMemoryTracking(TRUE);

	//Editor's Setup var. Init.
	m_ulListViewHeight		= 170;
	m_ulControlViewHeight	= 250;
	m_ulEditorWidth			= 260;

	m_pub_p_clCurrentGenerator	= NULL;
	m_pub_p_clCurrentSystem		= NULL;
	m_pub_p_clCurrentSource		= NULL;
	m_pub_p_clCurrentEnv		= NULL;
}

/*
 ----------------------------------------------------------------------------------------
  Description   :  destructor
 ----------------------------------------------------------------------------------------
 */
CPA_PartGen_MyDocument::~CPA_PartGen_MyDocument()
{
}


//*** Return the view on the document *******************
TPG_View * CPA_PartGen_MyDocument::m_pub_fn_p_clGetView()
{
	return g_pclInterface->m_pub_p_clView;
}


/*
 =======================================================================================
	Search loaded or unloaded object 
 =======================================================================================
 */

/*
 ----------------------------------------------------------------------------------------
  Description   : Search in link table for loaded ParticlesGenerators
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vSearchForLoadedGenerators()
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	SCR_tdst_Link_Table				*p_stLinkTable;
	unsigned int					uiPos;
	SCR_tdst_Link_Value				*p_stValue;
	tdxHandleToParticleGenerator	hGenerator;
	char							szName[256];
	CPA_PartGen_Generator			*p_oPrtGen;
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	/*
	 * get PrtGen link table
	 */
	p_stLinkTable = &(g_st3DOSLinkTable.stPrtGenLinkTable);

	//*** Get first element of array
	uiPos = 0;
	SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, p_stValue, SCR_M_st_Link_GetDynamicArray(p_stLinkTable) )

	while( p_stValue != NULL )
	{
		/* Test current retrieved value */
		if( SCR_M_e_Link_GetState(p_stValue) == SCR_ELS_Link_Initialized )
		{
			//*** get engine pointer ***************
			hGenerator = (tdxHandleToParticleGenerator)SCR_M_ul_Link_GetValue(p_stValue);

			//*** Get the Name for the generator ******************
			SCR_fn_v_RdL0_SplitSectionName(SCR_M_p_sz_Link_GetKey(p_stValue), NULL, NULL, szName);

			//*** Create editor object ********
			p_oPrtGen = (CPA_PartGen_Generator *) g_pclInterface->GetMainWorld()->fn_p_oFindObject(szName, C_szPartGenGeneratorName);
			if (p_oPrtGen == NULL )
			{
				new CPA_PartGen_Generator( szName, hGenerator );
			}
			else
			{
				if( p_oPrtGen->m_pub_fn_hGetGenerator() == NULL ) 
					p_oPrtGen->m_pub_fn_vSetGenerator( hGenerator );
			}
		}

		uiPos++;
		SCR_M_DyAr_GetNextElement(SCR_tdst_Link_Value, uiPos, p_stValue, SCR_M_st_Link_GetDynamicArray(p_stLinkTable) )
	}
}

/*
 ----------------------------------------------------------------------------------------
  Description   : Search in link table for loaded ParticlesSource
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vSearchForLoadedSources()
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	SCR_tdst_Link_Table		*p_stLinkTable;
	unsigned int			uiPos;
	SCR_tdst_Link_Value		*p_stValue;
	PRT_tdstParticlesSource *p_stPrtSrc;
	char					szName[256];
	CPA_PartGen_Source		*p_oPrtSrc;
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	
	/*
	 * Get ParticleSource link table
	 */
	p_stLinkTable = &(g_st3DOSLinkTable.stPrtSrcLinkTable);

	//*** Get first element of array
	uiPos = 0;
	SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, p_stValue, SCR_M_st_Link_GetDynamicArray(p_stLinkTable) )
		
	while( p_stValue != NULL )
	{
		/* Test current retrieved value */
		if( SCR_M_e_Link_GetState(p_stValue) == SCR_ELS_Link_Initialized )
		{
			//*** get engine pointer ***************
			p_stPrtSrc = (PRT_tdstParticlesSource *) SCR_M_ul_Link_GetValue( p_stValue );
				
			//*** Get the Name for the particle source ******************
			SCR_fn_v_RdL0_SplitSectionName(SCR_M_p_sz_Link_GetKey(p_stValue), NULL, NULL, szName);
				
			//*** Create editor object ********
			p_oPrtSrc = (CPA_PartGen_Source *) g_pclInterface->GetMainWorld()->fn_p_oFindObject(szName, C_szPartGenSourceName);
			if (p_oPrtSrc == NULL )
			{
				new CPA_PartGen_Source( szName, p_stPrtSrc );
			}
			else
			{
				if( p_oPrtSrc->m_pub_fn_p_stGetSource() == NULL ) 
					p_oPrtSrc->m_pub_fn_vSetSource( p_stPrtSrc );
			}
		}
		uiPos++;
		SCR_M_DyAr_GetNextElement(SCR_tdst_Link_Value, uiPos, p_stValue, SCR_M_st_Link_GetDynamicArray(p_stLinkTable) )
	}
}

/*
 ----------------------------------------------------------------------------------------
  Description   : Search in link table for loaded ParticlesSystem
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vSearchForLoadedSystems()
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	SCR_tdst_Link_Table		*p_stLinkTable;
	unsigned int			uiPos;
	SCR_tdst_Link_Value		*p_stValue;
	PRT_tdstParticlesSystem *p_stSystem;
	CPA_PartGen_System		*p_clSystem;
	char					szName[256];
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	/*
	 * Get ParticleSystem link table
	 */
	p_stLinkTable = &(g_st3DOSLinkTable.stPrtSysLinkTable);

	/* Get first element of array */
	uiPos = 0;
	SCR_M_DyAr_GetNextElement(SCR_tdst_Link_Value, uiPos, p_stValue, SCR_M_st_Link_GetDynamicArray(p_stLinkTable) )

	while( p_stValue != NULL )
	{
		/* Test current retrieved value */
		if( SCR_M_e_Link_GetState(p_stValue) == SCR_ELS_Link_Initialized )
		{
			// get engine object
			p_stSystem = (PRT_tdstParticlesSystem*)SCR_M_ul_Link_GetValue(p_stValue);

			// get engine object short name
			SCR_fn_v_RdL0_SplitSectionName( SCR_M_p_sz_Link_GetKey(p_stValue), NULL, NULL, szName);

			// create associated editor object if it doesn't exist
			p_clSystem = (CPA_PartGen_System*) g_pclInterface->GetMainWorld()->fn_p_oFindObject(szName, C_szPartGenSystemName);
			if (p_clSystem == NULL )
			{
				new CPA_PartGen_System( szName, p_stSystem );
			}
			else
			{
				if( p_clSystem->m_pub_fn_p_stGetSystem() == NULL ) 
					p_clSystem->m_pub_fn_vSetSystem( p_stSystem );
			}
		}

		uiPos++;
		SCR_M_DyAr_GetNextElement(SCR_tdst_Link_Value, uiPos, p_stValue, SCR_M_st_Link_GetDynamicArray(p_stLinkTable) )
	}
}

/*
 ----------------------------------------------------------------------------------------
  Description   : Search in link table for loaded ParticlesSource
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vSearchForLoadedEnvironments()
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	SCR_tdst_Link_Table				*p_stLinkTable;
	unsigned int					uiPos;
	SCR_tdst_Link_Value				*p_stValue;
	PRT_tdstParticlesEnvironment	*p_stEnv;
	CPA_PartGen_Environment			*p_clEnv;
	char							szName[256];
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	/*
	 * Get ParticleEnvironment link table
	 */
	p_stLinkTable = &(g_st3DOSLinkTable.stPrtEnvLinkTable);

	/* Get first element of array */
	uiPos = 0;
	SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, p_stValue, SCR_M_st_Link_GetDynamicArray(p_stLinkTable) )

	while( p_stValue != NULL )
	{
		/* Test current retrieved value */
		if( SCR_M_e_Link_GetState(p_stValue) == SCR_ELS_Link_Initialized )
		{
			p_stEnv = (PRT_tdstParticlesEnvironment*)SCR_M_ul_Link_GetValue(p_stValue);

			//Gets the Name for the Card
			SCR_fn_v_RdL0_SplitSectionName(SCR_M_p_sz_Link_GetKey(p_stValue), NULL, NULL, szName);
			
			p_clEnv =  (CPA_PartGen_Environment*) g_pclInterface->GetMainWorld()->fn_p_oFindObject(szName, C_szPartGenEnvName);
			if( p_clEnv == NULL ) 
			{
				new CPA_PartGen_Environment( szName, p_stEnv );
			}
			else
			{
				if( p_clEnv->m_pub_fn_p_stGetEnv() == NULL ) 
					p_clEnv->m_pub_fn_vSetEnv( p_stEnv );
			}
		}

		uiPos++;
		SCR_M_DyAr_GetNextElement(SCR_tdst_Link_Value, uiPos, p_stValue, SCR_M_st_Link_GetDynamicArray(p_stLinkTable) )
	}
}


/*
 ----------------------------------------------------------------------------------------
  Description   : Parse generator script file to find all unloaded generators and source
					(script section for particles generators and sources are for now
						in the same script file )
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vSearchForUnLoadedGeneratorsAndSources()
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	char						szFileName[ _MAX_PATH ];
	SCR_tdst_File_Open			*p_stFile;
	unsigned int				uiPos;
	SCR_tdst_Anl_SectionDes_	*p_stValue;
	CPA_PartGen_Generator		*p_oPrtGen;
	CPA_PartGen_Source			*p_oPrtSrc;
 	BOOL						bIsNotLoaded;
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	//*** get file name ******************
	sprintf( szFileName, "%s\\%s", C_szEffectPath, C_szGeneratorAndSourceFileName );
	
	if ( _access( szFileName, 4) != 0 )
		return;

	//Gets all the sections in the corresponding file
	SCR_fn_v_RdL0_OpenFile( szFileName );

	//*** Gets a pointer on the file ****************************************
	p_stFile = SCR_fnp_st_RdL0_GetOpenFile( szFileName ); 

	//**** Get first element of array *****************
	uiPos = 0;
	SCR_M_DyAr_GetNextElement(SCR_tdst_Anl_SectionDes_, uiPos, p_stValue, p_stFile->stSectionsDes )
				
	while( p_stValue != NULL ) /* p_sValue is NULL at the end of the array */
	{
		/*
		 * source section
		 */
		if (stricmp( p_stValue->stBuffers.p_szBufferName, C_SectionParticleSource) == 0)
		{
			bIsNotLoaded = g_pclInterface->GetMainWorld()->fn_p_oFindObject(p_stValue->stBuffers.p_szBufferNameExt, C_szPartGenSourceName) == NULL;
			if (bIsNotLoaded)
				p_oPrtSrc = new CPA_PartGen_Source( p_stValue->stBuffers.p_szBufferNameExt, NULL, FALSE );
		}
		/*
		 * generator section
		 */
		else if (stricmp( p_stValue->stBuffers.p_szBufferName, C_SectionParticleGenerator ) == 0 )
		{
			bIsNotLoaded = g_pclInterface->GetMainWorld()->fn_p_oFindObject(p_stValue->stBuffers.p_szBufferNameExt, C_szPartGenGeneratorName) == NULL;
			if (bIsNotLoaded)
				p_oPrtGen = new CPA_PartGen_Generator( p_stValue->stBuffers.p_szBufferNameExt, NULL, FALSE );
		}
			
		/* Get next element */
		uiPos++;
		SCR_M_DyAr_GetNextElement(SCR_tdst_Anl_SectionDes_, uiPos, p_stValue, p_stFile->stSectionsDes )
	}
}

/*
 ----------------------------------------------------------------------------------------
  Description   : Parse system script file to find all unloaded systems
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vSearchForUnLoadedSystems()
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	char						szFileName[ _MAX_PATH ];
	SCR_tdst_File_Open			*p_stFile;
	unsigned int				uiPos;
	SCR_tdst_Anl_SectionDes_	*p_stValue;
 	BOOL						bIsNotLoaded;
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	sprintf( szFileName, "%s\\%s", C_szEffectPath, C_szSystemFileName );

	if ( _access( szFileName, 4) != 0 )
		return;

	//Gets all the sections in the corresponding file
	SCR_fn_v_RdL0_OpenFile(szFileName);

	//Gets a pointer on the file
	p_stFile = SCR_fnp_st_RdL0_GetOpenFile( szFileName ); 

	// Get first element of array 
	uiPos = 0;
	SCR_M_DyAr_GetNextElement(SCR_tdst_Anl_SectionDes_, uiPos, p_stValue, p_stFile->stSectionsDes )
				
	while( p_stValue != NULL )
	{
		if (stricmp( p_stValue->stBuffers.p_szBufferName, C_SectionPrtSysDescription) == 0)
		{
			bIsNotLoaded = g_pclInterface->GetMainWorld()->fn_p_oFindObject(p_stValue->stBuffers.p_szBufferNameExt, C_szPartGenSystemName) == NULL;
			if (bIsNotLoaded)
				new CPA_PartGen_System( p_stValue->stBuffers.p_szBufferNameExt, NULL, FALSE );
		}
			
		/* Get next element */
		uiPos++;
		SCR_M_DyAr_GetNextElement(SCR_tdst_Anl_SectionDes_, uiPos, p_stValue, p_stFile->stSectionsDes )
	}
}


/*
 ----------------------------------------------------------------------------------------
  Description   : Parse environment script file to find all unloaded environments
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vSearchForUnLoadedEnvironments()
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	char						szFileName[ _MAX_PATH ];
	SCR_tdst_File_Open			*p_stFile;
	unsigned int				uiPos;
	SCR_tdst_Anl_SectionDes_	*p_stValue;
 	BOOL						bIsNotLoaded;
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	sprintf( szFileName, "%s\\%s", C_szEffectPath, C_szEnvironmentFileName );

	if ( _access( szFileName, 4) != 0 )
		return;

	//Gets all the sections in the corresponding file
	SCR_fn_v_RdL0_OpenFile(szFileName);

	//Gets a pointer on the file
	p_stFile = SCR_fnp_st_RdL0_GetOpenFile( szFileName ); 

	// Get first element of array 
	uiPos = 0;
	SCR_M_DyAr_GetNextElement(SCR_tdst_Anl_SectionDes_, uiPos, p_stValue, p_stFile->stSectionsDes )
				
	while( p_stValue != NULL )
	{
		if (stricmp( p_stValue->stBuffers.p_szBufferName, C_SectionPrtEnvDescription) == 0)
		{
			bIsNotLoaded = g_pclInterface->GetMainWorld()->fn_p_oFindObject(p_stValue->stBuffers.p_szBufferNameExt, C_szPartGenEnvName) == NULL;
			if (bIsNotLoaded)
				new CPA_PartGen_Environment( p_stValue->stBuffers.p_szBufferNameExt, NULL, FALSE );
		}
			
		/* Get next element */
		uiPos++;
		SCR_M_DyAr_GetNextElement(SCR_tdst_Anl_SectionDes_, uiPos, p_stValue, p_stFile->stSectionsDes )
	}
}

/*
 =======================================================================================
	Update and Display Functions
 =======================================================================================
 */

/*
 ----------------------------------------------------------------------------------------
  Description   : select a new generator and display it
  _p_clGenerator      -> new selected generator
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vUpdateGenerator( CPA_PartGen_Generator *_p_clGenerator )
{
	m_pub_p_clCurrentGenerator = _p_clGenerator;
	
	if( (_p_clGenerator != NULL) && (_p_clGenerator->fn_bIsAvailable()) )
	{
		m_pub_clGeneratorControlList.m_pub_fn_vUpdateControlsWithListOfData( &(m_pub_p_clCurrentGenerator->m_pub_clGeneratorDataList) );

		m_pri_fn_vUpdateSource	( m_pub_p_clCurrentGenerator->m_pub_fn_p_clGetSource() );
		m_pri_fn_vUpdateSystem	( m_pub_p_clCurrentGenerator->m_pub_fn_p_clGetSystem() );
		m_pri_fn_vUpdateEnv		( m_pub_p_clCurrentGenerator->m_pub_fn_p_clGetEnv() );
	}
	m_pub_fn_vDisplayCurrentGenerator();
}

/*
 ----------------------------------------------------------------------------------------
  Description   : select a new source
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pri_fn_vUpdateSource( CPA_PartGen_Source *_p_oPrtSrc )
{
	m_pub_p_clCurrentSource = _p_oPrtSrc;
	
	if( _p_oPrtSrc == NULL ) 
		return;

	if( _p_oPrtSrc->fn_bIsAvailable() )
		m_pub_clSourceControlList.m_pub_fn_vUpdateControlsWithListOfData( &(m_pub_p_clCurrentSource->m_pub_clDataList) );
}

/*
 ----------------------------------------------------------------------------------------
  Description   : select a new source and display it
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vUpdateSource( CPA_PartGen_Source *_oPrtSrc )
{
	m_pri_fn_vUpdateSource( _oPrtSrc );
	m_pub_fn_vDisplayCurrentGenerator();
}


/*
 ----------------------------------------------------------------------------------------
  Description   : select a new system
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pri_fn_vUpdateSystem( CPA_PartGen_System *_p_clSystem )
{
	m_pub_p_clCurrentSystem = _p_clSystem;
	
	if( _p_clSystem == NULL ) 
		return;

	if( _p_clSystem->fn_bIsAvailable() )
		m_pub_clSystemControlList.m_pub_fn_vUpdateControlsWithListOfData( &(m_pub_p_clCurrentSystem->m_pub_clDataList) );
}

/*
 ----------------------------------------------------------------------------------------
  Description   : select a new system and display it
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vUpdateSystem( CPA_PartGen_System *_p_clSystem )
{
	m_pri_fn_vUpdateSystem( _p_clSystem );
	m_pub_fn_vDisplayCurrentGenerator();
}

/*
 ----------------------------------------------------------------------------------------
  Description   : select a new environment
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pri_fn_vUpdateEnv( CPA_PartGen_Environment *_p_clEnv )
{
	m_pub_p_clCurrentEnv = _p_clEnv;
	
	if( _p_clEnv == NULL ) 
		return;

	if( _p_clEnv->fn_bIsAvailable() )
		m_pub_clEnvControlList.m_pub_fn_vUpdateControlsWithListOfData( &(m_pub_p_clCurrentEnv->m_pub_clDataList) );
}

/*
 ----------------------------------------------------------------------------------------
  Description   : select a new environment and display it
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vUpdateEnv( CPA_PartGen_Environment *_p_clEnv )
{
	m_pri_fn_vUpdateEnv( _p_clEnv );
	m_pub_fn_vDisplayCurrentGenerator();
}

/*
 ----------------------------------------------------------------------------------------
  Description   : display current paticles generator/source/system and environement
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vDisplayCurrentGenerator()
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	CRect	oRect;
	CPoint	oTopLeft;
	CPoint  oTopRight;
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	if( m_pub_fn_p_clGetView() == NULL ) 
		return;

	m_pub_fn_p_clGetView()->GetWindowRect( &oRect );
	m_pub_fn_p_clGetView()->ScreenToClient( &oRect );

	oTopLeft = oRect.TopLeft();
	oTopLeft.Offset( 20, 20 - m_pub_fn_p_clGetView()->GetScrollPosition().y );
	oTopRight = oRect.BottomRight();
	oTopRight.x -= 20;
	oTopRight.y = oTopLeft.y;

	/*
	 * display generators controls and data
	 */
	m_pub_fn_p_clGetView()->m_pub_fn_vDisplayGeneratorInZone( m_pub_p_clCurrentGenerator, &oTopLeft, &oTopRight );

	if( m_pub_p_clCurrentGenerator != NULL )
		m_pub_clGeneratorControlList.m_pub_fn_vDisplayControlsInZone( oTopLeft, oTopRight );
	else
		m_pub_clGeneratorControlList.m_pub_fn_vHideAllControls();

	oTopLeft.y += 20;
	oTopRight.y = oTopLeft.y;

	/*
	 * display source controls and data
	 */
	m_pub_fn_p_clGetView()->m_pub_fn_vDisplaySourceInZone( m_pub_p_clCurrentSource, &oTopLeft, &oTopRight );

	if( m_pub_p_clCurrentSource != NULL )
		m_pub_clSourceControlList.m_pub_fn_vDisplayControlsInZone( oTopLeft, oTopRight );
	else
		m_pub_clSourceControlList.m_pub_fn_vHideAllControls();

	oTopLeft.y += 20;
	oTopRight.y = oTopLeft.y;

	/*
	 * display system controls and data
	 */
	m_pub_fn_p_clGetView()->m_pub_fn_vDisplaySystemInZone( m_pub_p_clCurrentSystem, &oTopLeft, &oTopRight );

	if( m_pub_p_clCurrentSystem != NULL )
		m_pub_clSystemControlList.m_pub_fn_vDisplayControlsInZone( oTopLeft, oTopRight );
	else
		m_pub_clSystemControlList.m_pub_fn_vHideAllControls();

	oTopLeft.y += 20;
	oTopRight.y = oTopLeft.y;

	/*
	 * display environment controls and data
	 */
	m_pub_fn_p_clGetView()->m_pub_fn_vDisplayEnvInZone( m_pub_p_clCurrentEnv, &oTopLeft, &oTopRight );

	if( m_pub_p_clCurrentEnv != NULL )
		m_pub_clEnvControlList.m_pub_fn_vDisplayControlsInZone( oTopLeft, oTopRight );
	else
		m_pub_clEnvControlList.m_pub_fn_vHideAllControls();

	m_pub_fn_p_clGetView()->m_fn_vSetViewHeight( (unsigned short) oTopLeft.y + m_pub_fn_p_clGetView()->GetScrollPosition().y + 10 );
}


/*
 =======================================================================================
	Delete functions 
 =======================================================================================
 */


/*
 ----------------------------------------------------------------------------------------
  Description   : delete generator
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vDeleteGenerator()
{
	if( m_pub_p_clCurrentGenerator != NULL )
	{
		delete m_pub_p_clCurrentGenerator;
		m_pub_fn_vUpdateGenerator( NULL );
	}
}

/*
 ----------------------------------------------------------------------------------------
  Description   : delete source
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vDeleteSource()
{
	if( m_pub_p_clCurrentSource == NULL )
		return;

	if( m_pub_p_clCurrentGenerator != NULL )
		if( m_pub_p_clCurrentGenerator->m_pub_fn_p_clGetSource() == m_pub_p_clCurrentSource )
			m_pub_p_clCurrentGenerator->m_pub_fn_vSetSource( NULL );
		
	delete m_pub_p_clCurrentSource;
	m_pub_p_clCurrentSource = NULL;

	m_pub_fn_vUpdateChangingEnumDescriptors();
	m_pub_fn_vUpdateGenerator( m_pub_p_clCurrentGenerator );
}

/*
 ----------------------------------------------------------------------------------------
  Description   : delete system
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vDeleteSystem()
{
	if( m_pub_p_clCurrentSystem == NULL )
		return;

	if( m_pub_p_clCurrentGenerator != NULL )
		if( m_pub_p_clCurrentGenerator->m_pub_fn_p_clGetSystem() == m_pub_p_clCurrentSystem )
			m_pub_p_clCurrentGenerator->m_pub_fn_vSetSystem( NULL );
		
	delete m_pub_p_clCurrentSystem;
	m_pub_p_clCurrentSystem = NULL;

	m_pub_fn_vUpdateChangingEnumDescriptors();
	m_pub_fn_vUpdateGenerator( m_pub_p_clCurrentGenerator );
}

/*
 ----------------------------------------------------------------------------------------
  Description   : delete environment
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vDeleteEnv()
{
	if( m_pub_p_clCurrentEnv == NULL )
		return;

	if( m_pub_p_clCurrentGenerator != NULL )
		if( m_pub_p_clCurrentGenerator->m_pub_fn_p_clGetEnv() == m_pub_p_clCurrentEnv )
			m_pub_p_clCurrentGenerator->m_pub_fn_vSetEnv( NULL );

	delete m_pub_p_clCurrentEnv;
	m_pub_p_clCurrentEnv = NULL;

	m_pub_fn_vUpdateChangingEnumDescriptors();
	m_pub_fn_vUpdateGenerator( m_pub_p_clCurrentGenerator );
}


/*
 =======================================================================================
	function to Build all the controls used by the editor	
 =======================================================================================
 */

///// Fill Controls Lists /////////////////////////////
void CPA_PartGen_MyDocument::m_pub_fn_vFillControlLists()
{
	m_pri_fn_vFillGeneratorControlList();
	m_pri_fn_vFillSourceControlList();
	m_pri_fn_vFillSystemControlList();
	m_pri_fn_vFillEnvControlList();
}

///// Build controls for generator ////////////////////////////
void CPA_PartGen_MyDocument::m_pri_fn_vFillGeneratorControlList()
{
	//*** source associated with generator
	m_pub_clGeneratorControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Source", TRUE, 0 );

	//*** System associated with generator
	m_pub_clGeneratorControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "System" , TRUE, 0); //ANNECY BBB

	//*** Environment associated with generator
	m_pub_clGeneratorControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Environment" , TRUE, 0); //ANNECY BBB

	//*** Environment Mask
	m_pub_clGeneratorControlList.m_fn_pclAddMaskedControl( TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Environment Mask" , TRUE, 0 ); //ANNECY BBB

	//*** Link To Environment
	m_pub_clGeneratorControlList.m_fn_pclAddBooleanControl( TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Link To Environment" , TRUE, 0 ); //ANNECY BBB

	//*** Linked generator Mask
	m_pub_clGeneratorControlList.m_fn_pclAddMaskedControl( TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Linked generator Mask", TRUE, 0 );

	//*** Linked generator
	m_pub_clGeneratorControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Linked Generator", TRUE, 0 );


	CTL_fn_vSetModuleInfo("TPG", "Generator");
	m_pri_fn_vCreateControl( &m_pub_clGeneratorControlList );
	CTL_fn_vResetModuleInfo();
}

///// Build controls for source ////////////////////////////
void CPA_PartGen_MyDocument::m_pri_fn_vFillSourceControlList()
{
	//*** Generation Mode ********************
	m_pub_clSourceControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Generation Mode" , TRUE, 0); //ANNECY BBB
	//****** Probability **********
	CTL_Editor_Control *p_clControl = m_pub_clSourceControlList.m_fn_pclAddDecimalControl( 0., 1., sizeof(MTH_tdxReal), TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Probability" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceProbability );
	//****** Nb No Generation *******
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddIntegerControl(0, LONG_MAX, sizeof(ACP_tdxIndex), TPG_UNSIGNED, TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Nb Frames No Generation" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceNbFrames );
	//****** Nb Generation **********
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddIntegerControl(0, LONG_MAX, sizeof(ACP_tdxIndex), TPG_UNSIGNED, TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Nb Frames Generation" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceNbFrames );

	//*** Nb particles to generate mode ******
	m_pub_clSourceControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Nb Particles to Generate Mode" , TRUE, 0); //ANNECY BBB
	//****** Nb particles ***********
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddIntegerControl(0, LONG_MAX, sizeof(ACP_tdxIndex), TPG_UNSIGNED, TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Nb Particles" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceNbParticles );
	//****** Nb particles min *******
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddIntegerControl(0, LONG_MAX, sizeof(ACP_tdxIndex), TPG_UNSIGNED, TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Nb Particles min" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceNbParticlesMinMax );
	//****** Nb particles max *******
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddIntegerControl(0, LONG_MAX, sizeof(ACP_tdxIndex), TPG_UNSIGNED, TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Nb Particles max" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceNbParticlesMinMax );

	//*** Geometry Mode **********************
	m_pub_clSourceControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Geometry Mode" , TRUE, 0); //ANNECY BBB
	//****** Point ******************
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddVectorControl( MTH_C_InfinitMinus, MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, "Point 1" , TRUE, 0); //ANNECY BBB
	//****** Quad *******************
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddVectorControl( MTH_C_InfinitMinus, MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, "Point 2" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceGeometryQuad );
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddVectorControl( MTH_C_InfinitMinus, MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, "Point 3" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceGeometryQuad );

	//*** Link Mode **************************
	m_pub_clSourceControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Link Mode" , TRUE, 0); //ANNECY BBB

	//*** Speed and Range 
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddDecimalControl( MTH_C_InfinitMinus, MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Speed" , TRUE, 0); //ANNECY BBB
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddDecimalControl( MTH_C_InfinitMinus, MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Speed Range" , TRUE, 0); //ANNECY BBB

	//*** Life Mode
	m_pub_clSourceControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Life Mode", TRUE, 0 );
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddDecimalControl( 0., MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Life time (in sec)", TRUE, 0 );
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceConstantLifeTime );
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddDecimalControl( 0., MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Min Life time (in sec)", TRUE, 0 );
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceProbabilistLifeTime );
	p_clControl = m_pub_clSourceControlList.m_fn_pclAddDecimalControl( 0., MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Max Life time (in sec)", TRUE, 0 );
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSourceProbabilistLifeTime );


	CTL_fn_vSetModuleInfo("TPG", "Source");
	m_pri_fn_vCreateControl( &m_pub_clSourceControlList );
	CTL_fn_vResetModuleInfo();
}

///// Build controls for system //////////////////////////////
void CPA_PartGen_MyDocument::m_pri_fn_vFillSystemControlList()
{
	//*** Nb Particles ********************************
	m_pub_clSystemControlList.m_fn_pclAddIntegerControl(0, LONG_MAX, sizeof(ACP_tdxIndex), TPG_UNSIGNED, TPG_READONLY, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Nb Particles" , TRUE, 0); //ANNECY BBB
	
	//*** Objects Type *****************************
	m_pub_clSystemControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Particles Type" , TRUE, 0); //ANNECY BBB

	//*** Objects GameMaterial *********************
	CTL_Editor_Control *p_clControl = m_pub_clSystemControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Game Material" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSystemGameMaterials );

	//*** Objects Sprites
	p_clControl = m_pub_clSystemControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Sprites" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedSystemSprites );

	CTL_fn_vSetModuleInfo("TPG", "System");
	m_pri_fn_vCreateControl( &m_pub_clSystemControlList );
	CTL_fn_vResetModuleInfo();
}

///// Build controls for environment ////////////////////
void CPA_PartGen_MyDocument::m_pri_fn_vFillEnvControlList()
{
	//*** environment type **********************
	m_pub_clEnvControlList.m_fn_pclAddEnumControl( TPG_READWRITE, "Environment Type" , TRUE, 0); //ANNECY BBB

	//*** Box Min Max **************
	CTL_Editor_Control * p_clControl = m_pub_clEnvControlList.m_fn_pclAddVectorControl( MTH_C_InfinitMinus, MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, "Min" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedEnvBox );

	p_clControl = m_pub_clEnvControlList.m_fn_pclAddVectorControl( MTH_C_InfinitMinus, MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, "Max" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedEnvBox );

	//*** Sphere Center ****************
	p_clControl = m_pub_clEnvControlList.m_fn_pclAddVectorControl( MTH_C_InfinitMinus, MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, "Center" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedEnvSphere );

	//*** Sphere radius ******************************************
	p_clControl = m_pub_clEnvControlList.m_fn_pclAddDecimalControl( 0., MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Radius" , TRUE, 0); //ANNECY BBB
	p_clControl->m_pub_fn_vSetControlCanBeDisplayedCallBack( &g_fn_bCallBackCanBeDisplayedEnvSphere );

	//*** Acceleration ****************************
	m_pub_clEnvControlList.m_fn_pclAddVectorControl( MTH_C_InfinitMinus, MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, "Acceleration" , TRUE, 0); //ANNECY BBB

	//*** Acceleration range ***********************
	m_pub_clEnvControlList.m_fn_pclAddDecimalControl( MTH_C_InfinitMinus, MTH_C_InfinitPlus, sizeof(MTH_tdxReal), TPG_READWRITE, CTL_SPACING_TYPE__SINGLE_LINE, TPG_NOCHANGE, "Range" , TRUE, 0); //ANNECY BBB

	CTL_fn_vSetModuleInfo("TPG", "Environment");
	m_pri_fn_vCreateControl( &m_pub_clEnvControlList );
	CTL_fn_vResetModuleInfo();
}


///// Realy create all controls ////////////////////
void CPA_PartGen_MyDocument::m_pri_fn_vCreateControl( CTL_Editor_ControlList * _p_clControlList )
{
	CTL_Editor_Control *p_clControl = NULL;
	POSITION pos = _p_clControlList->GetHeadPosition();

	while( pos != NULL )
	{
		p_clControl = _p_clControlList->GetNext( pos );
		p_clControl->m_fn_bCreateControl( m_pub_fn_p_clGetView() );
//ROMTEAM Bugs Correction (Cristian Stegaru 24/03/98)
		if (CTL_DATA_TYPE__ENUM == p_clControl->m_pub_fn_tdeGetDataType())
		{
			((CTL_Editor_EnumControl *)p_clControl)->m_fn_iSetCanISelect_CallBack (g_fnCanISelectThisItemCallBack);
		}
//ENDROMTEAM Bugs Correction (Cristian Stegaru)
	}
}


/*
 =======================================================================================
	function to  Manage all EnumDescriptors and Masks
 =======================================================================================
 */

///// General function ////////////////////////////////////////
void CPA_PartGen_MyDocument::m_pub_fn_vBuildAllEnumDescriptors()
{
	m_pri_fn_vBuildChangingEnumDescriptors();
	m_pri_fn_vBuildConstantEnumDescriptors();
	m_pri_fn_vBuildConstantMasks();
}

///// Build changing EnumDescriptors ////////////////////////////////
void CPA_PartGen_MyDocument::m_pri_fn_vBuildChangingEnumDescriptors()
{
	//*** Generator : associated source **************
	CTL_Editor_EnumDescriptor *p_clEnumGeneratorSource = new CTL_Editor_EnumDescriptor( "Generator_Source", sizeof(long) );
	m_pri_clEnumDescriptorList.AddTail( p_clEnumGeneratorSource );

	//*** Generator : associated system **************
	CTL_Editor_EnumDescriptor *p_clEnumGeneratorSystem = new CTL_Editor_EnumDescriptor( "Generator_System", sizeof(long) );
	m_pri_clEnumDescriptorList.AddTail( p_clEnumGeneratorSystem );

	//*** Generator : associated environment ******
	CTL_Editor_EnumDescriptor *p_clEnumGeneratorEnv = new CTL_Editor_EnumDescriptor( "Generator_Env", sizeof(long) );
	m_pri_clEnumDescriptorList.AddTail( p_clEnumGeneratorEnv );

	//*** Generator : linked generator **************
	CTL_Editor_EnumDescriptor *p_clEnumGeneratorLinkedGenerator = new CTL_Editor_EnumDescriptor( "Generator_LinkedGenerator", sizeof(long) );
	m_pri_clEnumDescriptorList.AddTail( p_clEnumGeneratorLinkedGenerator );

	//*** System : GameMaterials ********************************
	CTL_Editor_EnumDescriptor *p_clEnumSystemObjectsGameMaterials = new CTL_Editor_EnumDescriptor( "System_ObjectsGameMaterials", sizeof(long) );
	m_pri_clEnumDescriptorList.AddTail( p_clEnumSystemObjectsGameMaterials );

	//*** System : Sprites *************************
	CTL_Editor_EnumDescriptor *p_clEnumSystemSprites = new CTL_Editor_EnumDescriptor( "System_Sprites", sizeof(long) );
	m_pri_clEnumDescriptorList.AddTail( p_clEnumSystemSprites );

	m_pub_fn_vUpdateChangingEnumDescriptors();
}

///// Update the changing EnumDescriptors //////////////////////////
void CPA_PartGen_MyDocument::m_pub_fn_vUpdateChangingEnumDescriptors()
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	CTL_Editor_EnumDescriptor	*p_clEnumDescriptor;
	CPA_BaseObjectList			*p_clList;
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	//*** Generator : associated source *********
	p_clEnumDescriptor	= m_pri_clEnumDescriptorList.m_fn_pclGetEnumDescriptorByName( "Generator_Source" );
	p_clList			= g_pclInterface->GetMainWorld()->fn_p_oGetOriginalObjectList( C_szPartGenSourceName );
	m_pri_fn_vFillEnumDescriptorWithBaseObjectList( p_clEnumDescriptor, p_clList );

	//*** Generator : associated system *********
	p_clEnumDescriptor	= m_pri_clEnumDescriptorList.m_fn_pclGetEnumDescriptorByName( "Generator_System" );
	p_clList			= g_pclInterface->GetMainWorld()->fn_p_oGetOriginalObjectList( C_szPartGenSystemName );
	m_pri_fn_vFillEnumDescriptorWithBaseObjectList( p_clEnumDescriptor, p_clList );

	//*** Generator : associated environment ******
	p_clEnumDescriptor	= m_pri_clEnumDescriptorList.m_fn_pclGetEnumDescriptorByName( "Generator_Env" );
	p_clList			= g_pclInterface->GetMainWorld()->fn_p_oGetOriginalObjectList( C_szPartGenEnvName );
	m_pri_fn_vFillEnumDescriptorWithBaseObjectList( p_clEnumDescriptor, p_clList );

	//*** Generator : linked generator ******
	p_clEnumDescriptor	= m_pri_clEnumDescriptorList.m_fn_pclGetEnumDescriptorByName( "Generator_LinkedGenerator" );
	p_clList			= g_pclInterface->GetMainWorld()->fn_p_oGetOriginalObjectList( C_szPartGenGeneratorName );
	m_pri_fn_vFillEnumDescriptorWithBaseObjectList( p_clEnumDescriptor, p_clList );

	//*** System : GameMaterials ******************
	p_clEnumDescriptor	= m_pri_clEnumDescriptorList.m_fn_pclGetEnumDescriptorByName( "System_ObjectsGameMaterials" );
	m_pri_fn_vFillEnumDescriptorWithLinkTable( p_clEnumDescriptor, GMT_fn_p_stGetLinkTable() );

	//*** System : Sprites ************************
	p_clEnumDescriptor	= m_pri_clEnumDescriptorList.m_fn_pclGetEnumDescriptorByName( "System_Sprites" );
	m_pri_fn_vFillEnumDescriptorWithList( p_clEnumDescriptor, &m_pub_clListOfSprites );
}

///// Build Constant EnumDescriptors //////////////////////////////
void CPA_PartGen_MyDocument::m_pri_fn_vBuildConstantEnumDescriptors()
{
	//*** Source : Generation Mode ************************
	CTL_Editor_EnumDescriptor *p_clEnumSourceGenerationMode = new CTL_Editor_EnumDescriptor( "Source_GenerationMode", 1 );
	p_clEnumSourceGenerationMode->m_fn_pclAddElement( "No Generation", PRT_C_ucNoGeneration, C_szNoGeneration);
	p_clEnumSourceGenerationMode->m_fn_pclAddElement( "Continous", PRT_C_ucContinousGeneration, C_szContinuousGeneration);
	p_clEnumSourceGenerationMode->m_fn_pclAddElement( "Probabilist", PRT_C_ucProbabilistGeneration, C_szProbabilistGeneration);
	p_clEnumSourceGenerationMode->m_fn_pclAddElement( "Crenel", PRT_C_ucCrenelGeneration, C_szCrenelGeneration);

	m_pri_clEnumDescriptorList.AddTail( p_clEnumSourceGenerationMode );

	//*** Source : Nb Particles to Generate Mode ***********
	CTL_Editor_EnumDescriptor *p_clEnumSourceNbParticlesMode = new CTL_Editor_EnumDescriptor( "Source_NbParticlesMode", 1 );
	p_clEnumSourceNbParticlesMode->m_fn_pclAddElement( "Constant", PRT_C_ucConstantNb, C_szConstantNb);
	p_clEnumSourceNbParticlesMode->m_fn_pclAddElement( "Probabilist", PRT_C_ucProbabilistNb, C_szProbabilistNb);

	m_pri_clEnumDescriptorList.AddTail( p_clEnumSourceNbParticlesMode );

	//*** Source : Geometry Mode ************************
	CTL_Editor_EnumDescriptor *p_clEnumSourceGeometryMode = new CTL_Editor_EnumDescriptor( "Source_GeometryMode", 1 );
	p_clEnumSourceGeometryMode->m_fn_pclAddElement( "Point", PRT_C_ucPoint, C_szPoint);
	p_clEnumSourceGeometryMode->m_fn_pclAddElement( "Quad", PRT_C_ucQuad, C_szQuad);

	m_pri_clEnumDescriptorList.AddTail( p_clEnumSourceGeometryMode );

	//*** Source : Link Mode ************************
	CTL_Editor_EnumDescriptor *p_clEnumSourceLinkMode = new CTL_Editor_EnumDescriptor( "Source_LinkMode", 1 );
	p_clEnumSourceLinkMode->m_fn_pclAddElement( "Rotation", PRT_C_ucRotationLink, C_szRotationLink);
	p_clEnumSourceLinkMode->m_fn_pclAddElement( "Translation", PRT_C_ucTranslationLink, C_szTranslationLink);
	p_clEnumSourceLinkMode->m_fn_pclAddElement( "Rotation and Translation", PRT_C_ucRotAndTransLink, C_szRotationAndTranslationLink);
	
	m_pri_clEnumDescriptorList.AddTail( p_clEnumSourceLinkMode );

	//*** Source : Life Mode ************************
	CTL_Editor_EnumDescriptor *p_clEnumSourceLifeMode = new CTL_Editor_EnumDescriptor( "Source_LifeMode", 1 );
	p_clEnumSourceLifeMode->m_fn_pclAddElement( "Infinit", PRT_C_ucNoLifeTime, C_EntryPrtSrcNoLifeTime);
	p_clEnumSourceLifeMode->m_fn_pclAddElement( "Constant", PRT_C_ucConstantLifeTime, C_EntryPrtSrcConstantLifeTime);
	p_clEnumSourceLifeMode->m_fn_pclAddElement( "Probabilist", PRT_C_ucProbabilistLifeTime, C_EntryPrtSrcProbabilistLifeTime);

	m_pri_clEnumDescriptorList.AddTail( p_clEnumSourceLifeMode );

	//*** System : Objects Type ************************
	CTL_Editor_EnumDescriptor *p_clEnumSystemObjectsType = new CTL_Editor_EnumDescriptor( "System_ObjectsType", sizeof(ACP_tdxIndex) );
	p_clEnumSystemObjectsType->m_fn_pclAddElement( "Null", PRT_C_xNullParticles, "" );
	p_clEnumSystemObjectsType->m_fn_pclAddElement( "Bubble", PRT_C_xBubbleParticles, "" );
	p_clEnumSystemObjectsType->m_fn_pclAddElement( "Point", PRT_C_xPointParticles, C_EntryPrtSysCreatePoint );
	p_clEnumSystemObjectsType->m_fn_pclAddElement( "Segment", PRT_C_xSegmentParticles, C_EntryPrtSysCreateSegment );
	p_clEnumSystemObjectsType->m_fn_pclAddElement( "Sprite", PRT_C_xSpriteParticles, C_EntryPrtSysCreateSprite );
	p_clEnumSystemObjectsType->m_fn_pclAddElement( "Triangle", PRT_C_xTriangleParticles, "" );
	p_clEnumSystemObjectsType->m_fn_pclAddElement( "Rectangle", PRT_C_xRectangleParticles, "" );

	m_pri_clEnumDescriptorList.AddTail( p_clEnumSystemObjectsType );


	//*** Environment Type ****************
	CTL_Editor_EnumDescriptor *p_clEnumEnvType = new CTL_Editor_EnumDescriptor( "Env_Type", sizeof(long) );
	p_clEnumEnvType->m_fn_pclAddElement( "Box", PRT_C_ulAlignedBoxEnv, C_szAlignedBox );
	p_clEnumEnvType->m_fn_pclAddElement( "Sphere", PRT_C_ulSphereEnv, C_szSphere );

	m_pri_clEnumDescriptorList.AddTail( p_clEnumEnvType );
}

///// Build Constant Masks //////////////////////////////
void CPA_PartGen_MyDocument::m_pri_fn_vBuildConstantMasks()
{
	CTL_Editor_MaskDescriptor *p_clMaskDescriptor;

	//*** Generator : environment mask
	p_clMaskDescriptor = new CTL_Editor_MaskDescriptor ( "Generator_Mask_Env" );
	p_clMaskDescriptor->m_pub_fn_pclAddMask( "Water", C_lEnvironmentWater );
	p_clMaskDescriptor->m_pub_fn_pclAddMask( "Air", C_lEnvironmentAir );
	m_pri_clMaskDescriptorList.AddTail( p_clMaskDescriptor );

	p_clMaskDescriptor = new CTL_Editor_MaskDescriptor ( "Generator_Mask_LinkedGen" );
	p_clMaskDescriptor->m_pub_fn_pclAddMask( "Reset speed", 1 );
	m_pri_clMaskDescriptorList.AddTail( p_clMaskDescriptor );
}

///// Find an EnumDescriptor using a name ////////
CTL_Editor_EnumDescriptor * CPA_PartGen_MyDocument::m_pub_fn_p_clGetEnumDescriptorByName( CString _csName )
{
	return m_pri_clEnumDescriptorList.m_fn_pclGetEnumDescriptorByName( _csName );
}

///// Find a mask using a name ///////////////////
CTL_Editor_MaskDescriptor * CPA_PartGen_MyDocument::m_pub_fn_p_clGetMaskDescriptorByName( CString _csName )
{
	return m_pri_clMaskDescriptorList.m_fn_pclGetMaskDescriptorByName( _csName );
}


///// Fill an EnumDescriptor using a BaseObjectList ///////////////////////
void CPA_PartGen_MyDocument::m_pri_fn_vFillEnumDescriptorWithBaseObjectList
(
 CTL_Editor_EnumDescriptor *_p_clEnumDescriptor,
 CPA_BaseObjectList * _p_clList
)
{
	CPA_BaseObject *p_clObj = NULL;
	Position pos = _p_clList->GetHeadPosition();
	
	_p_clEnumDescriptor->m_fn_vEmptyList();

	_p_clEnumDescriptor->m_fn_pclAddElement( "No Element", NULL );
	while( pos != NULL )
		{
		p_clObj = _p_clList->GetNext( pos );
		_p_clEnumDescriptor->m_fn_pclAddElement( p_clObj->GetName(), (long)p_clObj->GetData(), "", (void*)p_clObj );
		}
}

///// Fill an EnumDescriptor using a LinkTable ///////////////////////
void CPA_PartGen_MyDocument::m_pri_fn_vFillEnumDescriptorWithLinkTable( CTL_Editor_EnumDescriptor *_p_clEnumDescriptor, SCR_tdst_Link_Table *_p_stLinkTable )
{
	unsigned int uiPos = 0;
	SCR_tdst_Link_Value	*p_stValue;

	//*** reset combo *********
	_p_clEnumDescriptor->m_fn_vEmptyList();

	//*** Get first element
	SCR_M_DyAr_GetNextElement
		(
			SCR_tdst_Link_Value, 
			uiPos, 
			p_stValue, 
			SCR_M_st_Link_GetDynamicArray(_p_stLinkTable)
		)
		
	_p_clEnumDescriptor->m_fn_pclAddElement( "No Element", NULL );
	while( p_stValue != NULL ) //p_sValue is NULL at the end of the array
	{
		/* Test current retrieved value */
		if( SCR_M_e_Link_GetState(p_stValue) == SCR_ELS_Link_Initialized )
		{
			void *p_vEntry = (void*)SCR_M_ul_Link_GetValue(p_stValue);

			//*** Gets the Name for the Card ***********************
			CString csObjectName(SCR_M_p_sz_Link_GetKey(p_stValue));
			
			char a_256cFileName[256];
			char a_256cActionName[256];
			char a_256cName[256];
			SCR_fn_v_RdL0_SplitSectionName((char *)LPCTSTR(csObjectName), a_256cFileName, a_256cActionName, a_256cName);

			csObjectName = a_256cName;

			//*** fills combo ******************************
			_p_clEnumDescriptor->m_fn_pclAddElement( csObjectName, (long)p_vEntry );
		}

		uiPos++;
		SCR_M_DyAr_GetNextElement
			(
				SCR_tdst_Link_Value, 
				uiPos, 
				p_stValue, 
				SCR_M_st_Link_GetDynamicArray(_p_stLinkTable)
			)
	}
}

///// Fill an EnumDescriptor using a list of sprites ////////////
void CPA_PartGen_MyDocument::m_pri_fn_vFillEnumDescriptorWithList( CTL_Editor_EnumDescriptor *_p_clEnumDescriptor, CList<TPG_Sprite*,TPG_Sprite*>*_p_ListOfSprite )
{
	_p_clEnumDescriptor->m_fn_vEmptyList();

	POSITION pos = _p_ListOfSprite->GetHeadPosition();

	_p_clEnumDescriptor->m_fn_pclAddElement( "No Sprite", NULL, "", NULL );
	while( pos != NULL ) //pos is null at the end
		{
		TPG_Sprite *p_Sprite = _p_ListOfSprite->GetNext( pos );
		_p_clEnumDescriptor->m_fn_pclAddElement( p_Sprite->m_pub_fn_csGetName(), (long)p_Sprite->m_pub_fn_hGetSprite(), "", (void*)p_Sprite );
		}
}

/*
 =======================================================================================
	function to Fill internal data
 =======================================================================================
 */

/*
 ----------------------------------------------------------------------------------------
  Description   : parse Sprites particle script to find all sprites
 ----------------------------------------------------------------------------------------
 */
void CPA_PartGen_MyDocument::m_pub_fn_vFillListOfSprites()
{
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
	char						szFileName[ _MAX_PATH ];
	SCR_tdst_File_Open			*p_stFile;
	unsigned int				uiPos;
	SCR_tdst_Anl_SectionDes_	*p_stValue;
	ACP_tdxHandleOfSprite		hSprite;
	SCR_tdst_Link_Value			*p_stLink;
	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

	sprintf( szFileName, "%s\\%s", C_szEffectPath, C_szSpritesFileName );

	if ( _access( szFileName, 4) != 0 ) 
		return;								// file doesn't have read attirubutes, so stop parse operation

	//Gets all the sections in the corresponding file
	SCR_fn_v_RdL0_OpenFile(szFileName);

	//Gets a pointer on the file
	p_stFile = SCR_fnp_st_RdL0_GetOpenFile( szFileName ); 

	// Get first element of array 
	uiPos = 0;
	SCR_M_DyAr_GetNextElement(SCR_tdst_Anl_SectionDes_, uiPos, p_stValue, p_stFile->stSectionsDes )
				
	while( p_stValue != NULL )
	{
		if (stricmp( p_stValue->stBuffers.p_szBufferName, GLI_C_SectionSprite) == 0)
		{
			/*
			 * compute sprite full name and search it in sprite link table
			 */
			sprintf( szFileName, "%s\\%s", C_szEffectPath, p_stValue->stBuffers.p_szBufferName );
			p_stLink = SCR_fnp_st_Link_SearchKey( GLI_p_stGetLinkTableOfSprite(), szFileName );

			if( p_stLink != NULL ) 
				hSprite = (ACP_tdxHandleOfSprite) SCR_M_ul_Link_GetValue ( p_stLink );
			else
				hSprite = NULL;
		
			m_pub_clListOfSprites.AddTail( new TPG_Sprite( p_stValue->stBuffers.p_szBufferNameExt, hSprite ) );
		}
				
		/* Get next element */
		uiPos++;
		SCR_M_DyAr_GetNextElement(SCR_tdst_Anl_SectionDes_, uiPos, p_stValue, p_stFile->stSectionsDes ) 
	}
}
