reman3/Rayman_X/cpa/Appli/Max23Dos/src/SrfSave.c

165 lines
5.9 KiB
C

/*=========================================================================
*
* SrfSave.c - Saving functions for SRF file
*
* Version 1.0
* Revision date
*
*=======================================================================*/
#include <time.h>
#include "SrfSave.h"
#include "conventi.h"
#include "system.h" // for matrix.h
#include "SpoSave.h"
//--------------------------------------------------------------------
/****************************************************************************
* Description: save header in SRF file
*
* Parameters: p_stFile : script file pointer
* sFileName : file name
* p_vPtr : data pointer
* xAction : script action
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveSrfHeader (SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction)
{
xString sComment, sTime, sDate;
SCR_fn_v_SvL1_DeleteSection(p_stFile);
SCR_M_SvL0_SaveScriptFileHeader(p_stFile);
sprintf(sComment, ".SRF (Surface Information) : %s", p_stFile->a_szFileName);
SCR_M_SvL0_SaveComment(p_stFile, sComment);
SCR_M_SvL0_SaveBlankLine(p_stFile);
sprintf(sComment, "Generated by Max23Dos Moulinette");
SCR_M_SvL0_SaveComment(p_stFile, sComment);
SCR_M_SvL0_SaveBlankLine(p_stFile);
_strtime(sTime);
_strdate(sDate);
sprintf(sComment, "Created date : %s %s", sDate, sTime);
SCR_M_SvL0_SaveComment(p_stFile, sComment);
SCR_M_SvL0_SaveBlankLine(p_stFile);
sprintf(sComment, "Version directive, the version number is stored in file result 0");
SCR_M_SvL0_SaveComment(p_stFile, sComment);
SCR_M_SvL0_SaveDirective(p_stFile, M_SetCurrentFileDouble,SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%.2f", 0, 1.0);
SCR_M_SvL0_SaveBlankLine(p_stFile);
sprintf(sComment, "Unit directive, the unit is stored in file result 1");
SCR_M_SvL0_SaveComment(p_stFile, sComment);
sprintf(sComment, "And correspond to the value of one unit exprimed in meter");
SCR_M_SvL0_SaveComment(p_stFile, sComment);
SCR_M_SvL0_SaveDirective(p_stFile, M_SetCurrentFileDouble,SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%.2f", 1, 1.0);
SCR_M_SvL0_SaveBlankLine(p_stFile);
SCR_M_SvL0_SaveBlankLine(p_stFile);
}
/****************************************************************************
* Description: save surface in SRF file
*
* Parameters: p_stFile : script file pointer
* sFileName : file name
* p_vPtr : data pointer
* xAction : script action
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveSurface (SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction)
{
xString sFile, sSection, sIdent;
MLT_tdstSurface *p_stSrf;
p_stSrf = (MLT_tdstSurface*)p_vPtr;
if(xAction == SCR_EA_Ntfy_AddSection)
{
SCR_fn_v_SvL1_ToEndSection(p_stFile);
SCR_fn_v_SvL1_ToPrevLine(p_stFile);
}
else
SCR_fn_v_SvL1_DeleteSection(p_stFile);
MLT_vGetSurfaceName(sIdent, p_stSrf->sGeometric);
SCR_fn_v_RdL0_ComputeSectionName(sSection, "*", M_SurfaceDescription, sIdent);
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(sSection), SCR_CC_C_Cfg_EOL);
sprintf(sFile, "%s%s.mod", g_sDirectorySave, g_sFileIn);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_Geometric, p_stSrf->sGeometric);
SCR_M_SvL0_SaveEntry(p_stFile, M_SRFActionVisual, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, sSection);
MLT_vGetSurfaceName(sIdent, strstr(p_stSrf->stMatrix.sName, M_Surface));
SCR_fn_v_RdL0_ComputeSectionName(p_stSrf->stMatrix.sName, "*", M_Matrix, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_SRFActionVisualMatrix, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_stSrf->stMatrix.sName);
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
MLT_vSaveMatrix(p_stFile, &p_stSrf->stMatrix);
}
/****************************************************************************
* Description: save surface in SRF file
*
* Parameters: hRoot : hierarchy root
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveSrfFile (MLT_tdstSprObj *hRoot)
{
MLT_tdstSector *p_stSect;
xString sFile, sSection, sIdent;
long i,j;
sprintf(sFile,"%s.srf", g_sFileIn);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveSrfHeader, NULL, SCR_EA_Ntfy_AddSection);
// loop on the sector
for(j=0; j<hRoot->lNbChild; j++)
{
p_stSect = &hRoot->d_hChild[j]->stSector;
// loop on the surfaces
for(i=0; i<p_stSect->lNbSurface; i++)
{
MLT_vGetSurfaceName(sIdent, p_stSect->a_stSurface[i].sGeometric);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_SurfaceDescription, sIdent);
SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSaveSurface, &p_stSect->a_stSurface[i], SCR_EA_Ntfy_AddSection);
}
}
}
/****************************************************************************
* Description: get surface name
*
* Parameters: sName : final name
* sOldName : source name
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vGetSurfaceName(char *sName, char *sOldName)
{
char *c;
sprintf(sName, "%s", sOldName);
c = sName;
if ((c=strchr(c, '|')) != NULL)
{
if (*c == '|')
*c = 0;
}
}