/*=========================================================================
*
* ModLoad.c	- Loading functions for MOD file
*
* Version			1.0
* Revision date
*
*=======================================================================*/
#include "ModLoad.h"

#include "MTH.h"

#include "conventi.h"
#include "defines.h"
#include "main.h"
#include "print.h"
#include "system.h"
#include "util.h"
#include "vertex.h"

#include "ModLib.h"
#include "SpoLoad.h"
#include "Textures.h"



//--------------------------------------------------------------------



/****************************************************************************
*		Description:	init for loading a Mod file
*
*		Parameters:		
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vInitMODLoad ()
{
  // register all necessary callbacks
  SCR_fn_v_RdL0_RegisterCallback (M_Geometric,					MLT_xLoadGeometric,					SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_ElementIndexedTriangles,	MLT_xLoadElementIndexedTriangles,	SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_ElementFaceMapDescriptors,	MLT_xLoadElementFaceMapDescriptors, SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_ElementSprites,				MLT_xLoadElementSprites,			SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_ElementTMeshes,				MLT_xLoadElementTMeshes,			SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_ElementLines,				MLT_xLoadElementLines,				SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_ElementSpheres,				MLT_xLoadElementSpheres,			SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_ElementAlignedBoxes,		MLT_xLoadElementAlignedBoxes,		SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_ElementPoints,				MLT_xLoadElementPoints,				SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_ElementMegaFace,			MLT_xLoadElementMegaFace,			SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_FaceMapDescriptor,			MLT_xLoadFaceMapDescriptor,			SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_Sprite,						MLT_xLoadSprite,					SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_Material,					MLT_xLoadMaterial,					SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_Texture,					MLT_xLoadTextureSection,			SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_GameMaterial,				MLT_xLoadGameMaterial,				SCR_CRC_c_RdL0_ForSection);
  SCR_fn_v_RdL0_RegisterCallback (M_FichierMOD,					MLT_xLoadModCallback,				SCR_CRC_c_RdL0_ForFile);
}


/****************************************************************************
*		Description:	load a MOD file
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadModCallback(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  MLT_tdstGeometricObject **p_xGeometricInFile;
  MLT_tdstGeometricObject  *p_xFoundObject;
  long					    xNbGeometric;
  
  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_xGeometricInFile = (MLT_tdstGeometricObject**)malloc(sizeof(MLT_tdstGeometricObject*));
    
      SCR_M_RdL0_SetContextLong(0,0,(long)p_xGeometricInFile);
      SCR_M_RdL0_SetContextLong(0,1,(long)0);
      break;

    case SCR_EA_Anl_EndSubSection:
      if (strcmp(szParams[0],M_Geometric)==0)
      {
        MLT_tdstGeometricObject *hGeometric;

        SCR_M_RdL0_GetContextLong(0,0,MLT_tdstGeometricObject**,p_xGeometricInFile);
        SCR_M_RdL0_GetContextLong(0,1,long,xNbGeometric);
        SCR_M_RdL0_GetSectionLong(1,0,MLT_tdstGeometricObject*,hGeometric);

		p_xFoundObject = MLT_pFindInGivenLib(hGeometric->sName, p_xGeometricInFile, xNbGeometric);
		if (p_xFoundObject)
		{
			MLT_vOutput( C_ComRes_cErrorLine, "\nError : Object %s is duplicated", hGeometric->sName);
		}
		else
		{
			p_xGeometricInFile = (MLT_tdstGeometricObject**)realloc(p_xGeometricInFile,(++xNbGeometric)*sizeof(MLT_tdstGeometricObject*));

			p_xGeometricInFile[xNbGeometric-1]=hGeometric;


			SCR_M_RdL0_SetContextLong(0,0,(long)p_xGeometricInFile);
			SCR_M_RdL0_SetContextLong(0,1,(long)xNbGeometric);
		}
      }
      break;

    case SCR_EA_Anl_EndSection:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstGeometricObject**,p_xGeometricInFile);
      SCR_M_RdL0_GetContextLong(0,1,long,xNbGeometric);
      SCR_M_RdL0_SetSectionLong(0,0,(long)p_xGeometricInFile);
      SCR_M_RdL0_SetSectionLong(0,1,(long)xNbGeometric);
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}


/****************************************************************************
*		Description:	load a geometric object
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadGeometric(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  MLT_tdstGeometricObject	*p_stGeometric;
  long						xIndex;
  static long				lNbPoints, lNbEdges, lNbElements;
  xString					sFile, sAction, sIdent;
  char						*p_Char1;
  char						*p_sConstraintAxis;

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_stGeometric=(MLT_tdstGeometricObject*)malloc(sizeof(MLT_tdstGeometricObject));
      SCR_M_RdL0_SetSectionLong(0,0,(long)p_stGeometric);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_stGeometric);
      p_stGeometric->bNotForSave = FALSE;
      p_stGeometric->xNbPoints=atoi(szParams[0]);
      p_stGeometric->xNbEdges=atoi(szParams[1]);
      p_stGeometric->xNbElements=atoi(szParams[2]);
      sprintf(p_stGeometric->sName,"%s",SCR_M_RdL0_GetCompleteSectionNameR(0));
	  p_stGeometric->iFlags =0;
	  p_stGeometric->bHasElementOf = FALSE;
      SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sName, sFile, sAction, sIdent);
	  //remove the $flag$flag from its name
	  p_Char1=sIdent;
	  MLT_vRemoveFlags(&p_Char1);
	  strcpy(sIdent, p_Char1);
	  if ((g_cCategoryType == C_Bank) && (!g_bExistSpo))
	  {
		  p_sConstraintAxis = (char *)malloc(7*sizeof(char));
		  if (p_sConstraintAxis != NULL) 
		  {
			MLT_vGeomProp( &p_stGeometric->iFlags, &sIdent, &p_stGeometric->cGeom, &p_stGeometric->fGeom, &p_sConstraintAxis);
			strcpy(p_stGeometric->sConstraintAxis, p_sConstraintAxis);
			free(p_sConstraintAxis);
		  }
	  }
	  p_Char1=sIdent;
	  MLT_vRemoveGeomProp(&p_Char1);
	  strcpy(sIdent, p_Char1);
      SCR_fn_v_RdL0_ComputeSectionName(p_stGeometric->sName, sFile, sAction, sIdent);

      sprintf(p_stGeometric->sPointsOf,"");
      sprintf(p_stGeometric->sPhysicalSection, "");
      sprintf(p_stGeometric->sComment, "");
      MLT_xAllocateGeometric(p_stGeometric);
      lNbPoints = 0;
      lNbEdges = 0;
      lNbElements = 0;
      break;
                
    case SCR_EA_Anl_Entry:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstGeometricObject*,p_stGeometric);

      if(strcmp(szAction,M_MODActionComment)==0)
      {
        sprintf(p_stGeometric->sComment,"%s",szParams[0]);
      }

      // Loading object vertex
      if (strcmp(szAction,M_MODActionAddVertex)==0)
      {
        lNbPoints ++;
        xIndex = (long)atoi(szParams[0]);

        MLT_M_SetVertexXYZ((p_stGeometric->d_stListOfPoints+xIndex),
                          (float)(MLT_M_FloatToValue(atof(szParams[1]) * MLT_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName))),
                          (float)(MLT_M_FloatToValue(atof(szParams[2]) * MLT_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName))),
                          (float)(MLT_M_FloatToValue(atof(szParams[3]) * MLT_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName)))
                          );
        MLT_M_SetVertexXYZ((p_stGeometric->d_stListOfPointsNormals+xIndex),
                          (float)(MLT_M_FloatToValue(atof(szParams[4]))),
                          (float)(MLT_M_FloatToValue(atof(szParams[5]))),
                          (float)(MLT_M_FloatToValue(atof(szParams[6])))
                          );
        if (szParams[7] && szParams[8] &&szParams[9])
		{
			p_stGeometric->d_stListOfPointsReceivedLightIntensity[xIndex].xR=(float)(atof(szParams[7]));
			p_stGeometric->d_stListOfPointsReceivedLightIntensity[xIndex].xG=(float)(atof(szParams[8]));
			p_stGeometric->d_stListOfPointsReceivedLightIntensity[xIndex].xB=(float)(atof(szParams[9]));
		}
      } 

      if (strcmp(szAction,M_MODActionGetVertices)==0)
      {
        sprintf(p_stGeometric->sPointsOf,"%s",szParams[0]);
      } 

      // Loading object edge
      if (strcmp(szAction,M_MODActionAddEdge)==0)
      {
        lNbEdges ++;
        xIndex = (long)atoi(szParams[0]);

        p_stGeometric->d_stListOfEdges[xIndex].a2_xIndex[0] = (long)(atoi(szParams[1]));
        p_stGeometric->d_stListOfEdges[xIndex].a2_xIndex[1] = (long)(atoi(szParams[2]));
      } 

      // Loading object element
      if (strcmp(szAction,M_MODActionAddElement)==0)
      {
        unsigned short uwTypeElement;
        void *p_stElement;
        SCR_tdst_Cxt_Values *p_stVal;

        lNbElements ++;
        xIndex = atoi(szParams[0]);

        if(strcmp(szParams[1],M_IndexedTriangles)==0)
          uwTypeElement = MLT_C_xElementIndexedTriangles;
        else if(strcmp(szParams[1],M_FaceMapDescriptors)==0)
          uwTypeElement = MLT_C_xElementFaceMapDescriptors;
        else if(strcmp(szParams[1],M_TMeshes)==0)
          uwTypeElement = MLT_C_xElementTMeshes;
        else if(strcmp(szParams[1],M_Spheres)==0)
          uwTypeElement = MLT_C_xElementSpheres;
        else if(strcmp(szParams[1],M_AlignedBoxes)==0)
          uwTypeElement = MLT_C_xElementAlignedBoxes;
        else if(strcmp(szParams[1],M_Points)==0)
          uwTypeElement = MLT_C_xElementPoints;
        else if(strcmp(szParams[1],M_Sprites)==0)
          uwTypeElement = MLT_C_xElementSprites;
        else if(strcmp(szParams[1],M_Lines)==0)
          uwTypeElement = MLT_C_xElementLines;
        else if(strcmp(szParams[1],M_MegaFace)==0)
          uwTypeElement = MLT_C_xElementMegaFace;

        // load element
		p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[2], SCR_CDF_uw_Anl_Normal);
		p_stElement = (void *)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);

        p_stGeometric->d_xListOfElementsTypes[xIndex] = uwTypeElement;
        p_stGeometric->d_stListOfElements[xIndex] = p_stElement;
      } 

      if (strcmp(szAction,M_MODActionGetElement)==0)
      {
		p_stGeometric->bHasElementOf = TRUE;
        xIndex = atoi(szParams[0]);

        sprintf(p_stGeometric->sElementOf[xIndex],"%s",szParams[1]);
        p_stGeometric->sIndexOf[xIndex] = atoi(szParams[2]);
        p_stGeometric->d_xListOfElementsTypes[xIndex] = -1;
      } 
      break;

    case SCR_EA_Anl_EndSection:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstGeometricObject*,p_stGeometric);

	  if (strlen(p_stGeometric->sPointsOf) == 0)      
		  p_stGeometric->xNbPoints=lNbPoints;
      p_stGeometric->xNbEdges=lNbEdges;
	  if (!p_stGeometric->bHasElementOf)
		  p_stGeometric->xNbElements=lNbElements;
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}




/****************************************************************************
*		Description:	load an indexed triangle element
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadElementIndexedTriangles(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  long								xIndex;
  MLT_tdstElementIndexedTriangles	*p_stElement;
  char								*p_Char1; 

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_stElement=(MLT_tdstElementIndexedTriangles*)malloc(sizeof(MLT_tdstElementIndexedTriangles));
      
      SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement);

      p_stElement->xNbFaces=atoi(szParams[0]);
      p_stElement->xNbElementUV=atoi(szParams[1]);
      p_stElement->d_stListOfFacesTripled = (MLT_tdstTripledIndex*)malloc(p_stElement->xNbFaces*sizeof(MLT_tdstTripledIndex));
      p_stElement->d_stListOfFacesNormals = (MTH3D_tdstVector*)malloc(p_stElement->xNbFaces*sizeof(MTH3D_tdstVector));
      p_stElement->d_stListOfFacesTripledIndexUV = (MLT_tdstTripledIndex*)malloc(p_stElement->xNbFaces*sizeof(MLT_tdstTripledIndex));
      p_stElement->d_stListOfFacesReceivedLightIntensity = (MLT_tdstColor*)malloc(p_stElement->xNbFaces*sizeof(MLT_tdstColor));
      p_stElement->d_stListOfElementUV = (ACP_tdst2DUVValues*)malloc(p_stElement->xNbElementUV*sizeof(ACP_tdst2DUVValues));
      sprintf(p_stElement->sSectorName, "");
      sprintf(p_stElement->sMaterial, "");
      p_stElement->hMaterial = NULL;
      sprintf(p_stElement->sName, "%s", SCR_M_RdL0_GetCompleteSectionNameR(0));
	  p_stElement->xIndexOfParallelBox = -1;
	  sprintf(p_stElement->sFacesOf, "");
      sprintf(p_stElement->sUVsOf, "");
      break;

    case SCR_EA_Anl_Entry:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstElementIndexedTriangles*,p_stElement);

      // Loading Face
      if (strcmp(szAction,M_MODActionAddFaceUV)==0)
      {
        xIndex = (long)atoi(szParams[0]);

        p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[0]=(long)(atoi(szParams[1]));
        p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[1]=(long)(atoi(szParams[2]));
        p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[2]=(long)(atoi(szParams[3]));

        MLT_M_SetVertexXYZ((p_stElement->d_stListOfFacesNormals+xIndex),
                            MLT_M_FloatToValue((float)atof(szParams[4])),
                            MLT_M_FloatToValue((float)atof(szParams[5])),
                            MLT_M_FloatToValue((float)atof(szParams[6])) );

        p_stElement->d_stListOfFacesTripledIndexUV[xIndex].a3_xIndex[0]=(long)(atoi(szParams[7]));
        p_stElement->d_stListOfFacesTripledIndexUV[xIndex].a3_xIndex[1]=(long)(atoi(szParams[8]));
        p_stElement->d_stListOfFacesTripledIndexUV[xIndex].a3_xIndex[2]=(long)(atoi(szParams[9]));
      }

      if (strcmp(szAction,M_MODActionGetFaces)==0)
      {
        sprintf(p_stElement->sFacesOf, "%s", szParams[0]);
      } 

      if (strcmp(szAction,M_MODActionAddFace)==0)
      {
        xIndex = (long)atoi(szParams[0]);

        p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[0]=(long)(atoi(szParams[1]));
        p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[1]=(long)(atoi(szParams[2]));
        p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[2]=(long)(atoi(szParams[3]));

        MLT_M_SetVertexXYZ((p_stElement->d_stListOfFacesNormals+xIndex),
                          MLT_M_FloatToValue((float)atof(szParams[4])),
                          MLT_M_FloatToValue((float)atof(szParams[5])),
                          MLT_M_FloatToValue((float)atof(szParams[6]))
                          );

        p_stElement->d_stListOfFacesTripledIndexUV[xIndex].a3_xIndex[0]=(long)(0);
        p_stElement->d_stListOfFacesTripledIndexUV[xIndex].a3_xIndex[1]=(long)(0);
        p_stElement->d_stListOfFacesTripledIndexUV[xIndex].a3_xIndex[2]=(long)(0);
      }

      // Loading Element's UV
      if (strcmp(szAction,M_MODActionAddUV)==0)
      {
        xIndex = (long)atoi(szParams[0]);

        p_stElement->d_stListOfElementUV[xIndex].xU=(MLT_tdxUVValue)(atof(szParams[1]));
        p_stElement->d_stListOfElementUV[xIndex].xV=(MLT_tdxUVValue)(atof(szParams[2]));
      }

      if (strcmp(szAction,M_MODActionGetUVs)==0)
      {
        sprintf(p_stElement->sFacesOf, "%s", szParams[0]);
      } 

      // Loading material
      if (strcmp(szAction,M_MODActionMaterial)==0)
      {
        SCR_tdst_Cxt_Values *p_stVal;
        xString  sFile, sAction, sIdent;

        SCR_fn_v_RdL0_SplitSectionName(szParams[0], sFile, sAction, sIdent);
        SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sMaterial, sFile, sAction, sIdent);

// multitextures
		sprintf(sFile, "%s.mod", g_sFileIn);
        SCR_fn_v_RdL0_ComputeSectionName(sAction, sFile, M_Material, sIdent);
//		if(SCR_fn_c_RdL0_IsSectionExists(sAction))
//		{
		  p_stVal = SCR_fnp_st_RdL0_AnalyseSection(/*szParams[0]/*/sAction, SCR_CDF_uw_Anl_Normal);

		  p_stElement->hMaterial = (MLT_tdstMaterial*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);
		  // replace # with _
		  while ((p_Char1 = strstr(p_stElement->sMaterial, "#")) != NULL)
			  strncpy(p_Char1, "_", 1);
		  while ((p_Char1 = strstr(p_stElement->hMaterial->sName, "#")) != NULL)
			  strncpy(p_Char1, "_", 1);
		  //if the name of the material contains $..., remove the $... from it and complete the name of the CMT 
		  if ((p_Char1 = strstr(p_stElement->sMaterial, "$")) != NULL) 
		  {	
			p_stElement->sMaterial[strlen(p_stElement->sMaterial)-strlen(p_Char1)]='\0';
	        if ((p_Char1 = strstr(p_stElement->hMaterial->sName, "$")) != NULL)
			{	
				p_stElement->hMaterial->sName[strlen(p_stElement->hMaterial->sName)-strlen(p_Char1)]=0;
				strcpy(p_stElement->hMaterial->sNameCMT, p_Char1+1);
				p_stElement->hMaterial->bMaxMaterial = TRUE;
			}
		  }
		  else
		  {
			strcpy(p_stElement->hMaterial->sNameCMT, "");
			p_stElement->hMaterial->bMaxMaterial = TRUE;
		  }
//		}
      }

      // sector
	  if(strcmp (szAction,M_MODActionPointedSector)==0)
      {
        sprintf(p_stElement->sSectorName, "%s", szParams[0]);
      }
      break;

    case SCR_EA_Anl_EndSection:
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}

/****************************************************************************
*		Description:	load a face map descriptor element
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadElementFaceMapDescriptors(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  long								xIndex;
  MLT_tdstElementFaceMapDescriptors *p_stElement;
  xString							sFile, sAction, sIdent;
  char								*p_Char1; 

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_stElement=(MLT_tdstElementFaceMapDescriptors*)malloc(sizeof(MLT_tdstElementFaceMapDescriptors));

      SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement);
      
      p_stElement->xNbFaces=atoi(szParams[0]);
      p_stElement->d_stListOfFacesQuadrupled = (MLT_tdstFaceMapTriangle*)malloc(p_stElement->xNbFaces*sizeof(MLT_tdstFaceMapTriangle));
      p_stElement->d_stListOfFacesNormals = (MTH3D_tdstVector*)malloc(p_stElement->xNbFaces*sizeof(MTH3D_tdstVector));
      p_stElement->d_stListOfFacesReceivedLightIntensity = (MLT_tdstColor*)malloc(p_stElement->xNbFaces*sizeof(MLT_tdstColor));
      sprintf(p_stElement->sName, "%s", SCR_M_RdL0_GetCompleteSectionNameR(0));
      SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  //remove the $flag_flag from its name
	  p_Char1=sIdent;
	  MLT_vRemoveFlags(&p_Char1);
	  strcpy(sIdent, p_Char1);
      SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  p_stElement->xIndexOfParallelBox = -1;
      break;

    case SCR_EA_Anl_Entry:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstElementFaceMapDescriptors*,p_stElement);

      // Loading Face
      if (strcmp(szAction,M_MODActionAddFaceFMD)==0)
      {
        SCR_tdst_Cxt_Values *p_stVal;

        MLT_tdstFaceMapDescriptor **p_hFaceMapDescriptor;

        xIndex = (long)atoi(szParams[0]);

        // loading element
		p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[7], SCR_CDF_uw_Anl_Normal);
		p_hFaceMapDescriptor = (MLT_tdstFaceMapDescriptor **)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);

        p_stElement->d_stListOfFacesQuadrupled[xIndex].stFaceTripled.a3_xIndex[0]=(long)(atoi(szParams[1]));
        p_stElement->d_stListOfFacesQuadrupled[xIndex].stFaceTripled.a3_xIndex[1]=(long)(atoi(szParams[2]));
        p_stElement->d_stListOfFacesQuadrupled[xIndex].stFaceTripled.a3_xIndex[2]=(long)(atoi(szParams[3]));
        p_stElement->d_stListOfFacesQuadrupled[xIndex].hFaceMapDescriptor = *p_hFaceMapDescriptor;

        MLT_M_SetVertexXYZ((p_stElement->d_stListOfFacesNormals+xIndex),
                          MLT_M_FloatToValue((float)atof(szParams[4])),
                          MLT_M_FloatToValue((float)atof(szParams[5])),
                          MLT_M_FloatToValue((float)atof(szParams[6]))
                          );
      }
      break;

    case SCR_EA_Anl_EndSection:
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}

/****************************************************************************
*		Description:	load a sprite element
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadElementSprites(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  long					xIndex;
  MLT_tdstElementSprite *p_stElement;
  xString				sFile, sAction, sIdent;
  char					*p_Char1; 

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_stElement=(MLT_tdstElementSprite*)malloc(sizeof(MLT_tdstElementSprite));

      SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement);

      p_stElement->xNbSprites=atoi(szParams[0]);
      p_stElement->d_stListOfSprites = (MLT_tdstIndexedSprite*)malloc(p_stElement->xNbSprites*sizeof(MLT_tdstIndexedSprite));
      sprintf(p_stElement->sName, "%s", SCR_M_RdL0_GetCompleteSectionNameR(0));
      SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  //remove the $flag$flag from its name
	  p_Char1=sIdent;
	  MLT_vRemoveFlags(&p_Char1);
	  strcpy(sIdent, p_Char1);
      SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  p_stElement->xIndexOfParallelBox = -1;
      break;

    case SCR_EA_Anl_Entry:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstElementSprite*,p_stElement);

      // Loading of Face
      if (strcmp(szAction,M_MODActionAddSprite)==0)
      {
        SCR_tdst_Cxt_Values *p_stVal;

        MLT_tdstSprite **p_hSprite;

        xIndex = (long)atoi(szParams[0]);

        p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[4], SCR_CDF_uw_Anl_Normal);
	    p_hSprite = (MLT_tdstSprite **)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);

        p_stElement->d_stListOfSprites[xIndex].xCenterPoint=(long)(atoi(szParams[1]));
        p_stElement->d_stListOfSprites[xIndex].stSize.xX=(MTH_tdxReal)(atof(szParams[2]));
        p_stElement->d_stListOfSprites[xIndex].stSize.xY=(MTH_tdxReal)(atof(szParams[3]));
        p_stElement->d_stListOfSprites[xIndex].hSprite=*p_hSprite;
      }
      break;

    case SCR_EA_Anl_EndSection:
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}

/****************************************************************************
*		Description:	load a line element
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadElementLines(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  long					xIndex;
  MLT_tdstElementLines	*p_stElement;
  xString				sFile, sAction, sIdent;
  char					*p_Char1; 

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_stElement=(MLT_tdstElementLines*)malloc(sizeof(MLT_tdstElementLines));
      SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement);
      p_stElement->xNbLines=atoi(szParams[0]);
      p_stElement->d_stListOfLineIndex = (MLT_tdstDoubledIndex*)malloc(p_stElement->xNbLines*sizeof(MLT_tdstDoubledIndex));
      p_stElement->d_stListOfLinesReceivedLightIntensity = (MLT_tdstColor*)malloc(p_stElement->xNbLines*sizeof(MLT_tdstColor));
      sprintf(p_stElement->sName, "%s", SCR_M_RdL0_GetCompleteSectionNameR(0));
      SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  //remove the $flag$flag from its name
	  p_Char1=sIdent;
	  MLT_vRemoveFlags(&p_Char1);
	  strcpy(sIdent, p_Char1);
      SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  p_stElement->xIndexOfParallelBox = -1;
      break;

    case SCR_EA_Anl_Entry:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstElementLines*,p_stElement);

      // Loading Line
      if (strcmp(szAction,M_MODActionAddLine)==0)
      {
        xIndex = (long)atoi(szParams[0]);

        p_stElement->d_stListOfLineIndex[xIndex].a2_xIndex[0]=(long)(atoi(szParams[1]));
        p_stElement->d_stListOfLineIndex[xIndex].a2_xIndex[1]=(long)(atoi(szParams[2]));
      }

      if (strcmp(szAction,M_MODActionThickness)==0)
      {
        p_stElement->xThickness = (MTH_tdxReal)(atof(szParams[0]));
      }
      break;

    case SCR_EA_Anl_EndSection:
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}

/****************************************************************************
*		Description:	load a sphere element
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadElementSpheres(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  long						xIndex;
  MLT_tdstElementSpheres	*p_stElement;
  xString					sFile, sAction, sIdent;
  char						*p_Char1; 

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_stElement=(MLT_tdstElementSpheres*)malloc(sizeof(MLT_tdstElementSpheres));
      SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement);
      p_stElement->xNbSpheres=atoi(szParams[0]);
      p_stElement->d_stListOfSpheres = (MLT_tdstIndexedSphere*)calloc(p_stElement->xNbSpheres,sizeof(MLT_tdstIndexedSphere));
      sprintf(p_stElement->sName, "%s", SCR_M_RdL0_GetCompleteSectionNameR(0));
      SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  //remove the $flag$flag from its name
	  p_Char1=sIdent;
	  MLT_vRemoveFlags(&p_Char1);
	  strcpy(sIdent, p_Char1);
      SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  p_stElement->xIndexOfParallelBox = -1;
	  break;

    case SCR_EA_Anl_Entry:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstElementSpheres*,p_stElement);

      // Loading Face
      if (strcmp(szAction,M_MODActionAddSphere)==0)
      {
        SCR_tdst_Cxt_Values *p_stVal;

        xIndex = (long)atoi(szParams[0]);

        sprintf(p_stElement->d_stListOfSpheres[xIndex].sMaterial, "%s", szParams[3]);

		p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[3], SCR_CDF_uw_Anl_Normal);
		p_stElement->d_stListOfSpheres[xIndex].hMaterial = (MLT_tdstMaterial*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);
		// replace # with _
		while ((p_Char1 = strstr(p_stElement->d_stListOfSpheres[xIndex].sMaterial, "#")) != NULL)
			strncpy(p_Char1, "_", 1);
		while ((p_Char1 = strstr(p_stElement->d_stListOfSpheres[xIndex].hMaterial->sName, "#")) != NULL)
			strncpy(p_Char1, "_", 1);
		if ((p_Char1 = strstr(p_stElement->d_stListOfSpheres[xIndex].sMaterial, "$")) != NULL) 
		{	//change the name of the material and CMT
			p_stElement->d_stListOfSpheres[xIndex].sMaterial[strlen(p_stElement->d_stListOfSpheres[xIndex].sMaterial) -strlen(p_Char1)] = 0;
	        if ((p_Char1 = strstr(p_stElement->d_stListOfSpheres[xIndex].hMaterial->sName, "$")) != NULL)
			{	
				p_stElement->d_stListOfSpheres[xIndex].hMaterial->sName[strlen(p_stElement->d_stListOfSpheres[xIndex].hMaterial->sName)-strlen(p_Char1)]=0;
				strcpy(p_stElement->d_stListOfSpheres[xIndex].hMaterial->sNameCMT, p_Char1+1);
				p_stElement->d_stListOfSpheres[xIndex].hMaterial->bMaxMaterial = TRUE;
			}
		}
		else
		{
			strcpy(p_stElement->d_stListOfSpheres[xIndex].hMaterial->sNameCMT, "");
			p_stElement->d_stListOfSpheres[xIndex].hMaterial->bMaxMaterial = TRUE;
		}
        p_stElement->d_stListOfSpheres[xIndex].xCenterPoint=(long)(atoi(szParams[1]));
        p_stElement->d_stListOfSpheres[xIndex].xRadius=(MTH_tdxReal)(MLT_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName) * (float)atof(szParams[2]));
      }
      break;

    case SCR_EA_Anl_EndSection:
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}

/****************************************************************************
*		Description:	load a box element
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadElementAlignedBoxes(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  long							xIndex;
  MLT_tdstElementAlignedBoxes	*p_stElement;
  xString						sFile, sAction, sIdent;
  char							*p_Char1; 

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_stElement=(MLT_tdstElementAlignedBoxes*)malloc(sizeof(MLT_tdstElementAlignedBoxes));
      SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement);
      p_stElement->xNbAlignedBoxes=atoi(szParams[0]);
      p_stElement->d_stListOfAlignedBoxes = (MLT_tdstIndexedAlignedBox*)calloc(p_stElement->xNbAlignedBoxes,sizeof(MLT_tdstIndexedAlignedBox));
      sprintf(p_stElement->sName, "%s", SCR_M_RdL0_GetCompleteSectionNameR(0));
      SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  //remove the $flag$flag from its name
	  p_Char1=sIdent;
	  MLT_vRemoveFlags(&p_Char1);
	  strcpy(sIdent, p_Char1);
      SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  p_stElement->xIndexOfParallelBox = -1;
	  break;

    case SCR_EA_Anl_Entry:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstElementAlignedBoxes*,p_stElement);

      // Loading Line
      if (strcmp(szAction,M_MODActionAddAlignedBox)==0)
      {
        SCR_tdst_Cxt_Values *p_stVal;

        xIndex = (long)atoi(szParams[0]);

        sprintf(p_stElement->d_stListOfAlignedBoxes[xIndex].sMaterial, "%s", szParams[3]);

		p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[3], SCR_CDF_uw_Anl_Normal);
		p_stElement->d_stListOfAlignedBoxes[xIndex].hMaterial = (MLT_tdstMaterial*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);

		// replace # with _
		while ((p_Char1 = strstr(p_stElement->d_stListOfAlignedBoxes[xIndex].sMaterial, "#")) != NULL)
			strncpy(p_Char1, "_", 1);
		while ((p_Char1 = strstr(p_stElement->d_stListOfAlignedBoxes[xIndex].hMaterial->sName, "#")) != NULL)
			strncpy(p_Char1, "_", 1);
		if ((p_Char1 = strstr(p_stElement->d_stListOfAlignedBoxes[xIndex].sMaterial, "$")) != NULL) 
		{	
			p_stElement->d_stListOfAlignedBoxes[xIndex].sMaterial[strlen(p_stElement->d_stListOfAlignedBoxes[xIndex].sMaterial) -strlen(p_Char1)] = 0;
	        if ((p_Char1 = strstr(p_stElement->d_stListOfAlignedBoxes[xIndex].hMaterial->sName, "$")) != NULL) 
			{	
				p_stElement->d_stListOfAlignedBoxes[xIndex].hMaterial->sName[strlen(p_stElement->d_stListOfAlignedBoxes[xIndex].hMaterial->sName) - strlen(p_Char1)]=0;
				strcpy(p_stElement->d_stListOfAlignedBoxes[xIndex].hMaterial->sNameCMT, p_Char1+1);
				p_stElement->d_stListOfAlignedBoxes[xIndex].hMaterial->bMaxMaterial = TRUE;			
			}
		}
		else
		{
			strcpy(p_stElement->d_stListOfAlignedBoxes[xIndex].hMaterial->sNameCMT, "");
			p_stElement->d_stListOfAlignedBoxes[xIndex].hMaterial->bMaxMaterial = TRUE;
		}

        p_stElement->d_stListOfAlignedBoxes[xIndex].xMinPoint=(long)(atoi(szParams[1]));
        p_stElement->d_stListOfAlignedBoxes[xIndex].xMaxPoint=(long)(atoi(szParams[2]));
      }
      break;

    case SCR_EA_Anl_EndSection:
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}

/****************************************************************************
*		Description:	load a point element
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadElementPoints(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  long					xIndex;
  MLT_tdstElementPoints *p_stElement;
  xString				sFile, sAction, sIdent;
  char					*p_Char1; 

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_stElement=(MLT_tdstElementPoints*)malloc(sizeof(MLT_tdstElementPoints));
      SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement);
      p_stElement->xNbPoints=atoi(szParams[0]);
      p_stElement->d_xListOfPointIndex = (long*)malloc(p_stElement->xNbPoints*sizeof(long));
      sprintf(p_stElement->sName, "%s", SCR_M_RdL0_GetCompleteSectionNameR(0));
      SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  //remove the $flag$flag from its name
	  p_Char1=sIdent;
	  MLT_vRemoveFlags(&p_Char1);
	  strcpy(sIdent, p_Char1);
      SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
	  p_stElement->xIndexOfParallelBox = -1;
      break;

    case SCR_EA_Anl_Entry:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstElementPoints*,p_stElement);

      // Loading Line
      if (strcmp(szAction,M_MODActionAddPoint)==0)
      {
        xIndex = (long)atoi(szParams[0]);

        p_stElement->d_xListOfPointIndex[xIndex]=(long)(atoi(szParams[1]));
      }

      if (strcmp(szAction,M_MODActionFatness)==0)
      {
        p_stElement->xFatness = (MTH_tdxReal)(atof(szParams[0]));
      }
      break;

    case SCR_EA_Anl_EndSection:
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}

/****************************************************************************
*		Description:	load a TMesh element
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadElementTMeshes(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  return  SCR_ERV_Anl_NormalReturn;
}


/****************************************************************************
*		Description:	load a mega face element
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadElementMegaFace (SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  long						xIndex, iParam, i;
  MLT_tdstElementMegaFace	*p_stElement;
  MLT_tdstMegaFace			*p_stMegaFace;

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_stElement=(MLT_tdstElementMegaFace*)malloc(sizeof(MLT_tdstElementMegaFace));
      
      SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement);

      p_stElement->lNbMegaFaces=atoi(szParams[0]);
      p_stElement->d_stListOfMegaFaces = (MLT_tdstMegaFace*)malloc(p_stElement->lNbMegaFaces*sizeof(MLT_tdstMegaFace));
      sprintf(p_stElement->sName, "%s", SCR_M_RdL0_GetCompleteSectionNameR(0));
      break;

    case SCR_EA_Anl_Entry:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstElementMegaFace*,p_stElement);

      // Loading MegaFace
      if (strcmp(szAction,M_MODActionAddMegaFace)==0)
      {
        xIndex = (long)atoi(szParams[0]);
		
		p_stMegaFace = &p_stElement->d_stListOfMegaFaces[xIndex];
		
		p_stMegaFace->lIndex = xIndex;
		p_stMegaFace->lNbFaces = 0;

		iParam = 1;
		while (szParams[iParam] != NULL)
			iParam++;

		p_stMegaFace->lNbFaces = iParam - 1;

		p_stMegaFace->d_stListOfFaces = (long*)malloc(p_stMegaFace->lNbFaces*sizeof(long));

		for (i=0; i<p_stMegaFace->lNbFaces; i++)
			p_stMegaFace->d_stListOfFaces[i] = (long) atoi(szParams[i+1]);
	  }
	  break;


    case SCR_EA_Anl_EndSection:
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}





/****************************************************************************
*		Description:	load a face map descriptor
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadFaceMapDescriptor(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  MLT_tdstFaceMapDescriptor **p_hFMD;
  xString					sFile, sAction, sIdent;
  char						*p_Char1; 

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_hFMD=(MLT_tdstFaceMapDescriptor **)malloc(sizeof(MLT_tdstFaceMapDescriptor *));
      SCR_M_RdL0_SetSectionLong(0,0,(long)p_hFMD);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_hFMD);
      *p_hFMD = (MLT_tdstFaceMapDescriptor *)malloc(sizeof(MLT_tdstFaceMapDescriptor));
      sprintf((*p_hFMD)->sName, "%s", SCR_M_RdL0_GetCompleteSectionNameR(0));
      SCR_fn_v_RdL0_SplitSectionName((*p_hFMD)->sName, sFile, sAction, sIdent);
	  //remove the $flag$flag from its name
	  p_Char1=sIdent;
	  MLT_vRemoveFlags(&p_Char1);
	  strcpy(sIdent, p_Char1);
      SCR_fn_v_RdL0_ComputeSectionName((*p_hFMD)->sName, sFile, sAction, sIdent);
      (*p_hFMD)->hMaterial = NULL;
      (*p_hFMD)->AlreadySave = FALSE;
      break;

    case SCR_EA_Anl_Entry:
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstFaceMapDescriptor**,p_hFMD);

      // Loading Line
      if (strcmp(szAction,M_MODActionTripledUV)==0)
      {
        (*p_hFMD)->stUVValues[0].xU = (float)atof(szParams[0]);
        (*p_hFMD)->stUVValues[0].xV = (float)atof(szParams[1]);
        (*p_hFMD)->stUVValues[1].xU = (float)atof(szParams[2]);
        (*p_hFMD)->stUVValues[1].xV = (float)atof(szParams[3]);
        (*p_hFMD)->stUVValues[2].xU = (float)atof(szParams[4]);
        (*p_hFMD)->stUVValues[2].xV = (float)atof(szParams[5]);
      }

      if (strcmp(szAction,M_MODActionMaterial)==0)
      {
        SCR_tdst_Cxt_Values *p_stVal;
        xString  sFile, sAction, sIdent;

        SCR_fn_v_RdL0_SplitSectionName(szParams[0], sFile, sAction, sIdent);
        sprintf(sFile, "%s.gmt", g_sFileIn);
        sprintf(sAction, M_GameMaterial);
        SCR_fn_v_RdL0_ComputeSectionName((*p_hFMD)->sMaterial, sFile, sAction, sIdent);

// multitextures
		sprintf(sFile, "%s.mod", g_sFileIn);
        SCR_fn_v_RdL0_ComputeSectionName(sAction, sFile, M_Material, sIdent);
//		if(SCR_fn_c_RdL0_IsSectionExists(sAction))
//		{
		  p_stVal = SCR_fnp_st_RdL0_AnalyseSection(/*szParams[0]/*/sAction, SCR_CDF_uw_Anl_Normal);
		  (*p_hFMD)->hMaterial = (MLT_tdstMaterial*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);

		  // replace # with _
		  while ((p_Char1 = strstr((*p_hFMD)->sMaterial, "#")) != NULL)
			strncpy(p_Char1, "_", 1);
		  while ((p_Char1 = strstr((*p_hFMD)->hMaterial->sName, "#")) != NULL)
			strncpy(p_Char1, "_", 1);
		  if ((p_Char1 = strstr((*p_hFMD)->sMaterial, "$")) != NULL) 
		  {	(*p_hFMD)->sMaterial[strlen((*p_hFMD)->sMaterial) - strlen(p_Char1)] = 0;
	     	if ((p_Char1 = strstr((*p_hFMD)->hMaterial->sName, "$")) != NULL) 
			{	
				(*p_hFMD)->hMaterial->sName[strlen((*p_hFMD)->hMaterial->sName)-strlen(p_Char1)]=0;
				strcpy((*p_hFMD)->hMaterial->sNameCMT, p_Char1+1);
				(*p_hFMD)->hMaterial->bMaxMaterial = TRUE;
			}
		  }
		  else
		  {
			strcpy((*p_hFMD)->hMaterial->sNameCMT, "");
			(*p_hFMD)->hMaterial->bMaxMaterial = TRUE;
		  }
//		}
      }

      // sector
	  if(strcmp (szAction,M_MODActionPointedSector)==0)
      {
		    sprintf((*p_hFMD)->sSprObjFile, "%s", szParams[0]);
        sprintf((*p_hFMD)->sSprObjName, "%s", szParams[1]);
      }
      break;

    case SCR_EA_Anl_EndSection:
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}

/****************************************************************************
*		Description:	load a sprite
*
*		Parameters:		p_stFile	: script file pointer
*						szAction	: section or entry name
*						szParams	: parameters
*						cType		: action type
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
SCR_tde_Anl_ReturnValue MLT_xLoadSprite(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType)
{
  MLT_tdstSprite	**p_hSprite;
  long				xNbSprites;
  xString			sFile, sAction, sIdent;
  char				*p_Char1; 

  switch (cType)
  {
    case SCR_EA_Anl_BeginSection:
      p_hSprite=(MLT_tdstSprite **)malloc(sizeof(MLT_tdstSprite *));
      SCR_M_RdL0_SetSectionLong(0,0,(long)p_hSprite);
      SCR_M_RdL0_SetContextLong(0,0,(long)p_hSprite);
      (*p_hSprite) = (MLT_tdstSprite*)malloc(sizeof(MLT_tdstSprite));
      xNbSprites = atoi(szParams[0]);
      MLT_vCreateRotativSprite(p_hSprite, xNbSprites);
      sprintf((*p_hSprite)->sName, "%s", SCR_M_RdL0_GetCompleteSectionNameR(0));
      SCR_fn_v_RdL0_SplitSectionName((*p_hSprite)->sName, sFile, sAction, sIdent);
	  //remove the $flag$flag from its name
	  p_Char1=sIdent;
	  MLT_vRemoveFlags(&p_Char1);
	  strcpy(sIdent, p_Char1);
      SCR_fn_v_RdL0_ComputeSectionName((*p_hSprite)->sName, sFile, sAction, sIdent);
      (*p_hSprite)->AlreadySave = FALSE;
	  break;

    case SCR_EA_Anl_Entry:
      // Recuperation du handle a remplir
      SCR_M_RdL0_GetContextLong(0,0,MLT_tdstSprite**,p_hSprite);

      if (strcmp(szAction,M_MODActionAddMaterial)==0)
      {
        xString sFile, sAction, sIdent;
        long xIndex;
        SCR_tdst_Cxt_Values *p_stVal;
      
        xIndex = atoi(szParams[0]);
      
        SCR_fn_v_RdL0_SplitSectionName(szParams[1], sFile, sAction, sIdent);
        sprintf(sFile, "%s.gmt", g_sFileIn);
        SCR_fn_v_RdL0_ComputeSectionName((*p_hSprite)->d_sMaterial[xIndex], sFile, M_GameMaterial, sIdent);

// multitextures
		sprintf(sFile, "%s.mod", g_sFileIn);
        SCR_fn_v_RdL0_ComputeSectionName(sAction, sFile, M_Material, sIdent);
//		if(SCR_fn_c_RdL0_IsSectionExists(sAction))
//		{
		  p_stVal = SCR_fnp_st_RdL0_AnalyseSection(/*szParams[1]/*/sAction, SCR_CDF_uw_Anl_Normal);
		  (*p_hSprite)->d_hMaterial[xIndex] = (MLT_tdstMaterial*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);

		  // replace # with _
		  while ((p_Char1 = strstr((*p_hSprite)->d_hMaterial[xIndex]->sName, "#")) != NULL)
			strncpy(p_Char1, "_", 1);
		  while ((p_Char1 = strstr((*p_hSprite)->d_sMaterial[xIndex], "#")) != NULL)
			strncpy(p_Char1, "_", 1);
		  if ((p_Char1 = strstr((*p_hSprite)->d_hMaterial[xIndex]->sName, "$")) != NULL) 
		  {	
			(*p_hSprite)->d_sMaterial[xIndex][strlen((*p_hSprite)->d_sMaterial[xIndex]) - strlen(p_Char1)] = 0;
	        if ((p_Char1 = strstr((*p_hSprite)->d_hMaterial[xIndex]->sName, "$")) != NULL) 
			{	
				(*p_hSprite)->d_hMaterial[xIndex]->sName[strlen((*p_hSprite)->d_hMaterial[xIndex]->sName)-strlen(p_Char1)]=0;
				strcpy((*p_hSprite)->d_hMaterial[xIndex]->sNameCMT, p_Char1+1);
				(*p_hSprite)->d_hMaterial[xIndex]->bMaxMaterial = TRUE;
			}
		  }
		  else
		  {
			strcpy((*p_hSprite)->d_hMaterial[xIndex]->sNameCMT, "");
			(*p_hSprite)->d_hMaterial[xIndex]->bMaxMaterial = TRUE;
		  }
//		}
      }
    
      if( strcmp(szAction,M_MODActionAddInfo)==0)
      {
        long xIndex;
        MTH_tdxReal xParam;
        BOOL b2DScaled;
      
        xIndex = atoi(szParams[0]);
      
        if( strcmp(szParams[1],M_2DScaled)==0)
        {
          (*p_hSprite)->d_xSpriteDrawMode[xIndex] = MLT_C_lSpriteDrawMode2DScaled;
          b2DScaled = TRUE;
        }
        else if( strcmp(szParams[1],M_2DNonScaled)==0)
        {
          (*p_hSprite)->d_xSpriteDrawMode[xIndex] = 0;
          b2DScaled = FALSE;
        }
      
        xParam = MTH_M_xDoubleToReal(atof(szParams[2]));
        (*p_hSprite)->d_xThresholds[xIndex] = xParam;
      
        if(b2DScaled)
        {
          (*p_hSprite)->d_xSizeOfSprite[xIndex].xX = MTH_M_xDoubleToReal(atof(szParams[3])*MLT_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName));
          (*p_hSprite)->d_xSizeOfSprite[xIndex].xY = MTH_M_xDoubleToReal(atof(szParams[4])*MLT_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName));
        }
        else
        {
          (*p_hSprite)->d_xSizeOfSprite[xIndex].xX = MTH_M_xDoubleToReal(atof(szParams[3]));
          (*p_hSprite)->d_xSizeOfSprite[xIndex].xY = MTH_M_xDoubleToReal(atof(szParams[4]));
        }
      
        (*p_hSprite)->d_xDisplacementOfSprite[xIndex].xX = MTH_M_xDoubleToReal(atof(szParams[5]));
        (*p_hSprite)->d_xDisplacementOfSprite[xIndex].xY = MTH_M_xDoubleToReal(atof(szParams[6]));
      }
      break;

    case SCR_EA_Anl_EndSection:
      break;
  }
  return  SCR_ERV_Anl_NormalReturn;
}








/****************************************************************************
*		Description:	allocate a geometric object
*
*		Parameters:		p_stGeometric	: geometric object 
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_xAllocateGeometric(MLT_tdstGeometricObject *p_stGeometric)
{
  long xNbPoints,xNbElements,xNbEdges;

  xNbPoints=p_stGeometric->xNbPoints;
  xNbElements=p_stGeometric->xNbElements;
  xNbEdges=p_stGeometric->xNbEdges;

  if (xNbPoints)
  {
	  p_stGeometric->d_stListOfPoints=(MTH3D_tdstVector*)malloc(xNbPoints*sizeof(MTH3D_tdstVector));
	  p_stGeometric->d_stListOfPointsNormals=(MTH3D_tdstVector*)malloc(xNbPoints*sizeof(MTH3D_tdstVector));
	  p_stGeometric->d_stListOfPointsReceivedLightIntensity=(MLT_tdstColor*)malloc(xNbPoints*sizeof(MLT_tdstColor));
  }
  if ((!p_stGeometric->d_stListOfPoints) || (!p_stGeometric->d_stListOfPointsNormals) || (!p_stGeometric->d_stListOfPointsReceivedLightIntensity))
	  return ;
  
  if (xNbEdges)
	  p_stGeometric->d_stListOfEdges=(MLT_tdstDoubledIndex*)malloc(xNbEdges*sizeof(MLT_tdstDoubledIndex));
  if ((p_stGeometric->d_stListOfEdges==NULL) && (xNbEdges!=0))
	  return ;

  if (xNbElements)
  {
	  p_stGeometric->d_xListOfElementsTypes=(long*)malloc(xNbElements*sizeof(long));
	  p_stGeometric->d_stListOfElements=(void**)malloc(xNbElements*sizeof(void*));
	  p_stGeometric->sElementOf=(xString*)malloc(xNbElements*sizeof(xString));
	  p_stGeometric->sIndexOf=(long*)malloc(xNbElements*sizeof(long));
  }
  if (p_stGeometric->d_xListOfElementsTypes==NULL)
	  return ;
}                      


/****************************************************************************
*		Description:	create a sprite
*
*		Parameters:		p_hSprite	: sprite to create
*						xNbAngles	: nb of angles
*---------------------------------------------------------------------------
*		Revision date:                                      Author:         
*****************************************************************************/
void MLT_vCreateRotativSprite ( MLT_tdstSprite **p_hSprite , long xNbAngles)
{
  long liCount;

  *p_hSprite = (MLT_tdstSprite*)malloc(sizeof(MLT_tdstSprite));

  (*p_hSprite)->d_xThresholds = (MTH_tdxReal*)malloc(sizeof(long)*xNbAngles);
  (*p_hSprite)->d_xSpriteDrawMode = (short*)malloc(sizeof(short)*xNbAngles);
  (*p_hSprite)->d_hMaterial = (MLT_tdstMaterial **)malloc(sizeof(MLT_tdstMaterial*)*xNbAngles);
  (*p_hSprite)->d_sMaterial = (xString*)malloc(sizeof(xString)*xNbAngles);
  (*p_hSprite)->d_xSizeOfSprite = (MTH2D_tdstVector*)malloc(sizeof(MTH2D_tdstVector)*xNbAngles);
  (*p_hSprite)->d_xDisplacementOfSprite = (MTH2D_tdstVector*)malloc(sizeof(MTH2D_tdstVector)*xNbAngles);

  for(liCount=0; liCount<xNbAngles; liCount++)
  {
    (*p_hSprite)->d_hMaterial[liCount] = NULL;
    (*p_hSprite)->d_xSpriteDrawMode[liCount] = MLT_C_lSpriteDrawMode2DRotativ;
    (*p_hSprite)->d_xSizeOfSprite[liCount].xX = 1.00f;
    (*p_hSprite)->d_xSizeOfSprite[liCount].xY = 1.00f;
    (*p_hSprite)->d_xDisplacementOfSprite[liCount].xX = 0.0f;
    (*p_hSprite)->d_xDisplacementOfSprite[liCount].xY = 0.0f;
  }

  (*p_hSprite)->xNbSprites = xNbAngles;
}




