/*******************************************************/
/**** For the structures and variables declarations ****/
/*******************************************************/
#define D_MSLight_StructureDefine
/*#define D_MSLight_VariableDefine*/
 
#include "ACP_Base.h"
#include "CPA_Expt.h"
 
 
#ifdef U64
#include "CPA_Std.h"
#include "GEO/color.h"
#endif /*U64*/
 
 
#ifndef U64
#include "ToolsCPA.h"
#include "../../GLIGLOU/MULTIDRV/INC/light_st.h"
#else
#include "../../GLI/specif/light_st.h"
#include "ToolsCPA.h"
#endif /*U64*/
 
 
 
#include "Options/Options.h"
#include "Macros.h"
 
#include "Actions/AllActs.h"
 
#include "Structur/MemGame.h"
#include "Structur/ErrGame.h"
#include "Structur/Objects.h"
#include "Structur/GameScpt.h"
#include "Structur/StdObjSt.h"
#include "Structur/EngMode.h"
 
#include "Basic.h"
#include "GameEng.h"
#include "ObjInit.h"
#include "ZeMem.h"
#include "toolmatr.h"
 
#include "ldt.h"
 
#define sTagOn								'nO'
#define sTagType							'yT'
#define sTagFarNear						'aF'
#define sTagLittle						'iL'
#define sTagColor							'oC'
#define sTagGiroPhare					'iG'
#define sTagPulse							'uP'
#define sTagOffset						'fO'
#define sTagDirection					'iD'
 
#define sTagLocalLight				'oL'
 
 
#define sIn										'nI'
#define sInterMinPos					'iM'
#define sInterMaxPos					'aM'
#define sEx										'xE'
#define sExterMinPos					'iM'					
#define sExterMaxPos					'aM'
#define sIntensityMinMax			'is'
 
 
/*****************************************************************
Function name   : fn_iCreateMSLight
Description     : 
Author          : Ovidiu Scripa (oscripa@ubisoft.ro) - ROMTEAM
Creation Date   : 13-Oct-98
Modified        : 
Return type     : int 
Argument        : LDT_tdst_Link *pLink
*****************************************************************/
int fn_iCreateMSLight( LDT_tdst_Link *pLink )
{
	char* szParam;
	MS_tdxHandleToMSLight h_MSLight;
	struct tdstEngineObject_ *p_stEngineObject = (struct tdstEngineObject_ *)pLink->pParent->pObject;
 
	szParam = LDT_szGetParam( 1 ); 
 
    MMG_fn_vBeginMemoryInfo (MMG_C_lTypeMiniStructure , MMG_C_lSubTypeLight , p_stEngineObject);
	h_MSLight = fn_h_LightRealAlloc();
    MMG_fn_vEndMemoryInfo ();
 
	p_stEngineObject->h_MSLight=h_MSLight;
	pLink->pObject = (void*)h_MSLight;
 
	if (!stricmp(szParam,"Parallel"))
		fn_vMSLightSetTypeOfLight(h_MSLight,1);
	else if (!stricmp(szParam,"Spherical"))
		fn_vMSLightSetTypeOfLight(h_MSLight,2);
	else if (!stricmp(szParam,"HotSpot"))
		fn_vMSLightSetTypeOfLight(h_MSLight,3);
	else if (!stricmp(szParam,"Ambient"))
		fn_vMSLightSetTypeOfLight(h_MSLight,4);
	/*CHINA WFQ (MT) 16-02-98 {*/
	else if (!stricmp(szParam,"ParallelBox"))
		fn_vMSLightSetTypeOfLight(h_MSLight,5);
	/*ENDCHINA WFQ }*/
	else
		fn_vMSLightSetTypeOfLight(h_MSLight,4);
 
  return 0;
}
 
 
/*****************************************************************
Function name   : fn_iLoadMSLight
Description     : 
Author          : Ovidiu Scripa (oscripa@ubisoft.ro) - ROMTEAM
Creation Date   : 13-Oct-98
Modified        : 
Return type     : int 
Argument        : LDT_tdst_Link *pLink
*****************************************************************/
int fn_iLoadMSLight( LDT_tdst_Link *pLink )
{
  LDT_tdeParseResult result=ParseResult_BeginSection;
	MS_tdxHandleToMSLight h_MSLight = (MS_tdxHandleToMSLight)pLink->pObject;
 
 
  while( result!=ParseResult_EndSection ) 
  {
  	result=LDT_GetNextEntry();
  	switch( result )
  	{
  	  case ParseResult_Entry: /* an entry */
  	  {
  	    char *szEntry=LDT_szGetEntryName();
  	    switch (*(short*)szEntry)
  	    {
 
  	      case  sTagOn : /*  */
  	      {
						if (strlen(szEntry)>2) /* OnlyLocalLight*/
						{
							fn_vMSLightSetOnlyLocalLight(h_MSLight,(unsigned char)atoi(LDT_szGetParam(1)));
						}
						else /*On*/
						{ 
							fn_vMSLightSetOnOff(h_MSLight,(unsigned char)atoi(LDT_szGetParam(1)));
						}
  	      }
  	      break;
  	      case  sTagType : /*  */
  	      {
  	      }
  	      break;
  	      case  sTagFarNear : /*  */
  	      {
						fn_vMSLightSetNearFar(h_MSLight,
							(float)atof(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)));
 
  	      }
  	      break;
  	      case  sTagLittle : /*  */
  	      {
						if (strlen(szEntry)>15) /*LittleBigTangent*/
						{
						}
						else									/*LittleBigAlpha*/
						{
							fn_vMSLightSetAlphas(h_MSLight,
								(float)atof(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)));
						}
  	      }
  	      break;
  	      case  sTagColor : /*  */
  	      {
						fn_vMSLightSetColorRGBA(h_MSLight,
							(GEO_tdxColorValue)atof(LDT_szGetParam(1)),(GEO_tdxColorValue)atof(LDT_szGetParam(2)),(GEO_tdxColorValue)atof(LDT_szGetParam(3)),(GEO_tdxColorValue)atof(LDT_szGetParam(4)));
  	      }
  	      break;
  	      case  sTagGiroPhare : /*  */
  	      {
						fn_vMSLightSetGiroPhare(h_MSLight,
							(unsigned char)atoi(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)));
  	      }
  	      break;
  	      case  sTagPulse : /*  */
  	      {
						fn_vMSLightSetPulse(h_MSLight,
							(unsigned char)atoi(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)), (float)atof(LDT_szGetParam(3)));
  	      }
  	      break;
  	      case  sTagOffset : /*  */
  	      {
						fn_vMSLightSetOffset(h_MSLight,
						 (float)atof(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)), (float)atof(LDT_szGetParam(3)) );
  	      }
  	      break;
  	      case  sTagDirection : /*  */
  	      {
						fn_vMSLightSetDirection(h_MSLight,
							(float)atof(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)), (float)atof(LDT_szGetParam(3)) );
  	      }
  	      break;
  	      case  sTagLocalLight : /*  */
		      {
						fn_vMSLightSetLocalLight(h_MSLight,(unsigned char)atoi(LDT_szGetParam(1)));
					}
  	      case  sIn : /*  */
		      {
						switch (*(short*)(szEntry+5))
						{
  						case  sInterMinPos : /*  */
  						{
								fn_xMSLightSetInterMinXYZ(h_MSLight,
									(float)atof(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)), (float)atof(LDT_szGetParam(3)) );
  						}
  						break;
  						case  sInterMaxPos : /*  */
  						{
								fn_xMSLightSetInterMaxXYZ(h_MSLight,
									(float)atof(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)), (float)atof(LDT_szGetParam(3)) );
 
  						}
  						break;
  						case  sIntensityMinMax : /*  */
  						{
								fn_xMSLightSetIntensityMinMax(h_MSLight,
									(float)atof(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)));
  						}
  						break;
						}
					}
  	      case  sEx : /*  */
		      {
						switch (*(short*)(szEntry+5))
						{
  						case  sExterMinPos : /*  */
  						{
								fn_xMSLightSetExterMinXYZ(h_MSLight,
									(float)atof(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)), (float)atof(LDT_szGetParam(3)) );
 
  						}
  						break;
  						case  sExterMaxPos : /*  */
  						{
								fn_xMSLightSetExterMaxXYZ(h_MSLight,
									(float)atof(LDT_szGetParam(1)), (float)atof(LDT_szGetParam(2)), (float)atof(LDT_szGetParam(3)) );
 
  						}
  						break;
						}
					}
 
  	    }
  	  }
  	}
  }
																																					
 
  return 0;
}
 
 
