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

1504 lines
57 KiB
C

/*=========================================================================
*
* ModSave.h - Saving functions for MOD file
*
* Version 1.0
* Revision date
*
*=======================================================================*/
#include "ModSave.h"
#include "conventi.h"
#include "defines.h"
#include "main.h"
#include "print.h"
#include "system.h"
#include "ModLib.h"
#include "PhySave.h"
#include "SpoSave.h"
#include "VseSave.h"
#include "ZooSave.h"
#include "Altimaps.h"
//--- Global statics --------------------------------------------------------
static char *gs_a_szElementTypeName[] =
{
"",
M_IndexedTriangles,
M_FaceMapDescriptors,
M_Sprites,
M_TMeshes,
M_Points,
M_Lines,
M_Spheres,
M_AlignedBoxes,
M_Cones,
M_Altimap,
M_MegaFace
};
//--- Global extern --------------------------------------------------------
char g_szInstancesSaved[200][256];
int g_iNbInstancesSaved = 0;
//--- header functions --------------------------------------------------------
void MLT_vSaveEmptyModHeader(SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction)
{
}
//--------------------------------------------------------------------
/****************************************************************************
* Description: save geometric object
*
* Parameters: p_stFile : script file pointer
* p_stGeometric : geometric object
* bPhy : flag to save PHY
* bTbl : flag to save TBL
* bZoo : flag to save ZOO
* bVse : flag to save VSE
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveGeometricObject (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstGeometricObject *p_stGeometric, BOOL bPhy, BOOL bTbl, BOOL bZoo, BOOL bVse)
{
long lNoPhy, lNoLod;
long i;
MLT_tdstGeometricObject *p_stObjOrg;
MLT_tdstElementAltimap *p_stAltimap;
ACP_tdxIndex xIndexOfParallelBox;
xString sSection, sFileOut;
xString mes, sComment;
xString sFile2, sIdent2;
xString sFile, sAction, sIdent;
xString sForme, sHabillage, sName;
BOOL bTest;
BOOL bAltimap = TRUE;
char *sName1, *p_Char1, *p_char;
int iX=0, iY=0, iZ=0;
if(p_stGeometric == NULL)
return;
if(p_stGeometric->bNotForSave)
return;
// Rayman2 version : no more GoThrough
if ((g_bRaymanII)&&(strstr(p_stGeometric->sName, "Gothrough")))
return; //don't save anymore the frtb objects
if(strlen(p_stGeometric->sPhysicalSection) != 0)
{
// save TBL
if(bTbl)
{
sprintf(sFile, "%s.tbl", g_sFileIn);
sprintf(mes, "%d", p_stGeometric->lNumberInTable);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_Tbl, mes);
SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSaveTbl, p_stGeometric, SCR_EA_Ntfy_AddSection);
}
// save PHY
if(bPhy)
{
SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sPhysicalSection, sFile, sAction, sIdent);
sprintf(sIdent2, "PO_%s", sIdent);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSavePhy, p_stGeometric, SCR_EA_Ntfy_AddOrModifySection);
}
// save ZOO
if(bZoo)
{
SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sName, sFile, sAction, sIdent2);
SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sPhysicalSection, sFile, sAction, sIdent);
if (strcmp(sIdent, sIdent2))
bTest = TRUE;
else
bTest = FALSE;
sprintf(sFile2, "%s.zoo", g_sFileIn);
SCR_fn_v_RdL0_ComputeSectionName(sFile, sFile2, M_AllCollideSets, "");
sprintf(sFile2, "%s", sFile, SCR_CC_sz_Cfg_SectionIdMark);
sprintf(sIdent2, "CS_%s", sIdent);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile2, M_CS, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(sFile, MLT_vSaveAllCollideSetsSection, NULL, SCR_EA_Ntfy_AddOrModifySection);
SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSaveZoo, p_stGeometric, SCR_EA_Ntfy_AddOrModifySection);
}
// save VSE
if(bVse)
{
SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sPhysicalSection, sFile, sAction, sIdent);
sprintf(sFile, "%s.vse", g_sFileIn);
MLT_vSplitModuleSectionName(sIdent, sForme, sHabillage, &lNoPhy, &lNoLod, sName);
MLT_vComputeVisualSetSectionName(sIdent, sForme, sHabillage, sName);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_VS, sIdent);
p_stGeometric->lNbLod = MLT_lSaveLodInFile(sSection);
sprintf(sIdent2, "VSE_%s", sIdent);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_VS, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(sSection, MLT_vSaveVisualSet, p_stGeometric, SCR_EA_Ntfy_AddOrModifySection);
}
}
sprintf(sFileOut, "%s.mod", g_sFileIn);
SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sName, sFile, sAction, sIdent);
// find object in lib
p_stObjOrg = MLT_pFindAlmostInLib(p_stGeometric->sName);
if (p_stObjOrg == NULL)
{
MLT_vOutput( C_ComRes_cErrorLine, "\nError : Can't find %s", p_stGeometric->sName);
}
// check coherence
if ((p_stObjOrg != p_stGeometric)&&(!bTest))
{
if( (p_stObjOrg->xNbPoints != p_stGeometric->xNbPoints) )
{
MLT_vOutput( C_ComRes_cWarningLine, "\nWarning : Not the same object %s : %s", p_stObjOrg->sName, p_stGeometric->sName);
}
else
{
sprintf(p_stGeometric->sPointsOf, "%s", p_stObjOrg->sName);
}
}
// check if this object is an instance
if((p_char=strstr(sIdent, "=")) != NULL)
{
strcpy(p_char, "\0");
for (i=0; i<g_iNbInstancesSaved; i++)
{
if (!strcmp(sIdent, g_szInstancesSaved[i]))
return;
}
strcpy(g_szInstancesSaved[g_iNbInstancesSaved++], sIdent);
}
// remove collision flags
if (strstr(MLT_p_cGetSectionName(p_stGeometric->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stGeometric->sName), "!NOCOL"))
{
sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stGeometric->sName));
if((p_char=strstr(sName1, "=")) != NULL)
strcpy(p_char, "\0");
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
{
sName1 = MLT_p_cGetSectionName(p_stGeometric->sName);
if((p_char=strstr(sName1, "=")) != NULL)
strcpy(p_char, "\0");
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
// test altimap structure
if (p_stGeometric->iFlags & ~IS_NOT_ALTIMAP & MAYBE_ALTIMAP)
{
p_stAltimap = (MLT_tdstElementAltimap*)malloc(sizeof(MLT_tdstElementAltimap));
MLT_vCompleteAltimapStructure(p_stGeometric, p_stAltimap);
bAltimap = FALSE;
}
if (p_stGeometric->iFlags & IS_NOT_ALTIMAP)
{
MLT_vOutput( C_ComRes_cWarningLine, "\nWarning : %s is not an altimap, even if its name contains #ALT or #alt suffix.", p_stGeometric->sName);
bAltimap = TRUE;
}
// normal object
if (!bAltimap)
{
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%d,%d",0,0,1);
if(strlen(p_stGeometric->sComment) != 0)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionComment, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_stGeometric->sComment);
}
if(strlen(p_stGeometric->sComment) == 0)
{
if (MLT_bTestSymmetry(p_stGeometric) && (p_stGeometric->iFlags & MAYBE_SYM))
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionComment, SCR_CC_C_Cfg_NoChar);
sprintf(sComment, "#Sym(%c,%.0f)", p_stGeometric->cGeom, p_stGeometric->fGeom);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, sComment);
}
if (!MLT_bTestSymmetry(p_stGeometric) && (p_stGeometric->iFlags & MAYBE_SYM))
MLT_vOutput( C_ComRes_cWarningLine, "\nWarning : %s is not symmetric with the given plane.", p_stGeometric->sName);
if (p_stGeometric->iFlags & IS_LOOKAT)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionLookAt, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, "FALSE");
}
if (p_stGeometric->iFlags & IS_SEMI_LA)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionLookAt, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, "TRUE");
}
}
SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sName, sFile, sAction, sIdent);
if(stricmp(sFile, sFileOut)==0)
sprintf(sFile, "*");
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_ElementAltimap, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddElement, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%s,%s", 0, M_Altimap, sSection);
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
SCR_fn_v_RdL0_ComputeSectionName(p_stAltimap->sName, sFileOut, M_ElementAltimap, sIdent);
MLT_vSaveElementAltimap(p_stFile, p_stAltimap);
MLT_vFreeAltimap(p_stAltimap);
}
// altimap object
else
{
SCR_fn_v_SvL0_SaveParameters_MP (p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%d,%d", p_stGeometric->xNbPoints, 0, p_stGeometric->xNbElements);
if(strlen(p_stGeometric->sComment) != 0)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionComment, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_stGeometric->sComment);
}
if(strlen(p_stGeometric->sComment) == 0)
{
if (MLT_bTestSymmetry(p_stGeometric) && (p_stGeometric->iFlags & MAYBE_SYM))
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionComment, SCR_CC_C_Cfg_NoChar);
sprintf(sComment, "#Sym(%c,%.0f)", p_stGeometric->cGeom, p_stGeometric->fGeom);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, sComment);
}
if (!MLT_bTestSymmetry(p_stGeometric) && (p_stGeometric->iFlags & MAYBE_SYM))
MLT_vOutput( C_ComRes_cWarningLine, "\nWarning : %s is not symmetric with the given plane.", p_stGeometric->sName);
if (p_stGeometric->iFlags & IS_LOOKAT)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionLookAt, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, "FALSE");
}
if (p_stGeometric->iFlags & IS_SEMI_LA)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionLookAt, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, "TRUE");
}
}
if(strlen(p_stGeometric->sPointsOf) != 0)
{
SCR_fn_v_RdL0_SplitSectionName(p_stGeometric->sPointsOf, sFile, sAction, sIdent);
if(stricmp(sFile, sFileOut)==0)
sprintf(sFile, "*");
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionGetVertices, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, sSection);
}
else
{
for(i=0; i<p_stGeometric->xNbPoints; i++)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddVertex, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 11, "%d,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.1f,%.1f,%.1f",
i,
p_stGeometric->d_stListOfPoints[i].xX,
p_stGeometric->d_stListOfPoints[i].xY,
p_stGeometric->d_stListOfPoints[i].xZ,
p_stGeometric->d_stListOfPointsNormals[i].xX,
p_stGeometric->d_stListOfPointsNormals[i].xY,
p_stGeometric->d_stListOfPointsNormals[i].xZ,
p_stGeometric->d_stListOfPointsReceivedLightIntensity[i].xR,
p_stGeometric->d_stListOfPointsReceivedLightIntensity[i].xG,
p_stGeometric->d_stListOfPointsReceivedLightIntensity[i].xB);
}
}
for(i=0; i<p_stGeometric->xNbElements; i++)
{
typedef struct MLT_tdstElementBidon_
{
xString sName;
ACP_tdxIndex xIndexOfParallelBox;
} MLT_tdstElementBidon;
if(p_stGeometric->d_xListOfElementsTypes[i] == -1)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionGetElement, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP
(
p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%s,%d",
i,
p_stGeometric->sElementOf[i],
p_stGeometric->sIndexOf[i]
);
}
else
{
SCR_fn_v_RdL0_SplitSectionName
(
((MLT_tdstElementBidon*)(p_stGeometric->d_stListOfElements[i]))->sName,
sFile, sAction, sIdent
);
if(stricmp(sFile, sFileOut)==0)
sprintf(sFile, "*");
if (strstr(sIdent, "!nocol")
|| strstr(sIdent, "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(sIdent);
strcpy(sIdent, sName1);
}
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent);
xIndexOfParallelBox = ((MLT_tdstElementBidon*)(p_stGeometric->d_stListOfElements[i]))->xIndexOfParallelBox;
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddElement, SCR_CC_C_Cfg_NoChar);
if (xIndexOfParallelBox == -1)
{
SCR_fn_v_SvL0_SaveParameters_MP
(
p_stFile,
SCR_EF_SvL0_Scanf,
4,
"%d,%s,%s",
i,
gs_a_szElementTypeName[p_stGeometric->d_xListOfElementsTypes[i]],
sSection
);
}
else
{
SCR_fn_v_SvL0_SaveParameters_MP
(
p_stFile,
SCR_EF_SvL0_Scanf,
5,
"%d,%s,%s,%d",
i,
gs_a_szElementTypeName[p_stGeometric->d_xListOfElementsTypes[i]],
sSection,
xIndexOfParallelBox
);
}
}
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
for(i=0; i<p_stGeometric->xNbElements; i++)
{
switch(p_stGeometric->d_xListOfElementsTypes[i])
{
case MLT_C_xElementIndexedTriangles:
MLT_vSaveElementIndexedTriangle(p_stFile,
(MLT_tdstElementIndexedTriangles*)(p_stGeometric->d_stListOfElements[i]));
break;
case MLT_C_xElementFaceMapDescriptors:
MLT_vSaveElementFaceMapDescriptors(p_stFile,
(MLT_tdstElementFaceMapDescriptors*)(p_stGeometric->d_stListOfElements[i]));
break;
case MLT_C_xElementSprites:
MLT_vSaveElementSprites(p_stFile,
(MLT_tdstElementSprite*)(p_stGeometric->d_stListOfElements[i]));
break;
case MLT_C_xElementTMeshes:
MLT_vSaveElementTMeshes(p_stFile,
(MLT_tdstElementTMeshes*)(p_stGeometric->d_stListOfElements[i]));
break;
case MLT_C_xElementPoints:
MLT_vSaveElementPoints(p_stFile,
(MLT_tdstElementPoints*)(p_stGeometric->d_stListOfElements[i]));
break;
case MLT_C_xElementLines:
MLT_vSaveElementLines(p_stFile,
(MLT_tdstElementLines*)(p_stGeometric->d_stListOfElements[i]));
break;
case MLT_C_xElementSpheres:
MLT_vSaveElementSpheres(p_stFile,
(MLT_tdstElementSpheres*)(p_stGeometric->d_stListOfElements[i]));
break;
case MLT_C_xElementAlignedBoxes:
MLT_vSaveElementAlignedBox(p_stFile,
(MLT_tdstElementAlignedBoxes*)(p_stGeometric->d_stListOfElements[i]));
break;
case MLT_C_xElementCones:
MLT_vSaveElementCones(p_stFile,
(MLT_tdstElementCones*)(p_stGeometric->d_stListOfElements[i]));
break;
case MLT_C_xElementMegaFace:
MLT_vSaveElementMegaFace(p_stFile,
(MLT_tdstElementMegaFace*)(p_stGeometric->d_stListOfElements[i]));
break;
}
}
}
}
/****************************************************************************
* Description: save indexed triangle element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementIndexedTriangle (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementIndexedTriangles *p_stElement)
{
xString mes, sFile, sAction, sIdent, sIdent2;
char *sName1, *p_Char1;
long i;
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL"))
{
sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%d",
p_stElement->xNbFaces,
p_stElement->xNbElementUV);
if(strlen(p_stElement->sMaterial) != 0)
{
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sMaterial, sFile, sAction, sIdent);
sprintf(sFile, "%s%s.gmt", g_sDirectorySave, g_sFileMaterial);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionMaterial, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, mes);
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sMaterial, sFile, sAction, sIdent);
sprintf(sFile, "%s.gmt", g_sFileMaterial);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveGameMaterial, p_stElement->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sMaterial, sFile, sAction, sIdent);
sprintf(sFile, "%s.vmt", g_sFileMaterial);
sprintf(sIdent2, "MAT_%s", sIdent);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Material, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveVisualMaterial, p_stElement->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
for(i=0;i<p_stElement->hMaterial->lTexture;i++)
{
p_stElement->hMaterial->lCurTexture = 0;
sprintf(sFile, "%s.tex", g_sFileMaterial);
sprintf(sIdent2, "TEX_%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(p_stElement->hMaterial->sTexture[i]))));
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, p_stElement->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
}
// multitextures
for(i=0;i<p_stElement->hMaterial->lMultiTexture;i++)
{
p_stElement->hMaterial->lCurTexture = 0;
if (!g_bExistTex) //the .tex file doesn't exist
sprintf(sFile, "%s.tex", g_sFileMaterial);
else
{
if (g_bIgnoreTex)
{ if (g_bLevelConversion)
sprintf(sFile, "%s\\World\\levels\\%stemp.tex", g_sGameData, g_sDirectorySave);
if (g_bBankConversion)
sprintf(sFile, "%s\\World\\graphics\\objects\\banks\\%stemp.tex", g_sGameData, g_sDirectorySave);
if (g_bClassConversion)
sprintf(sFile, "%s\\World\\graphics\\objects\\classes\\%stemp.tex", g_sGameData, g_sDirectorySave);
}
else
sprintf(sFile, "%s.tex", g_sFileMaterial);
}
sprintf(sIdent2, "%s", p_stElement->hMaterial->stMultiTexture[i].sTexture);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, p_stElement->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
}
}
if(strlen(p_stElement->sSectorName) != 0)
{
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sSectorName, sFile, sAction, sIdent);
sprintf(sFile, "%s%s.spo", g_sDirectorySave, g_sFileIn);
sprintf(sAction, M_SuperObject);
sprintf(sIdent2, "SPO_%s", sIdent);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, sAction, sIdent2);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionPointedSector, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, mes);
}
if(strlen(p_stElement->sFacesOf) != 0)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionGetFaces, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, p_stElement->sFacesOf);
}
else
{
for(i=0; i<p_stElement->xNbFaces; i++)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddFaceUV, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 11, "%d,%d,%d,%d,%.6f,%.6f,%.6f,%d,%d,%d",
i,
p_stElement->d_stListOfFacesTripled[i].a3_xIndex[0],
p_stElement->d_stListOfFacesTripled[i].a3_xIndex[1],
p_stElement->d_stListOfFacesTripled[i].a3_xIndex[2],
p_stElement->d_stListOfFacesNormals[i].xX,
p_stElement->d_stListOfFacesNormals[i].xY,
p_stElement->d_stListOfFacesNormals[i].xZ,
p_stElement->d_stListOfFacesTripledIndexUV[i].a3_xIndex[0],
p_stElement->d_stListOfFacesTripledIndexUV[i].a3_xIndex[1],
p_stElement->d_stListOfFacesTripledIndexUV[i].a3_xIndex[2]);
}
}
if(strlen(p_stElement->sUVsOf) != 0)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionGetUVs, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, p_stElement->sUVsOf);
}
else
{
for(i=0; i<p_stElement->xNbElementUV; i++)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddUV, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%.6f,%.6f",
i,
p_stElement->d_stListOfElementUV[i].xU,
p_stElement->d_stListOfElementUV[i].xV);
}
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/****************************************************************************
* Description: save face map descriptor element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementFaceMapDescriptors(SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementFaceMapDescriptors *p_stElement)
{
xString sSection, sFile, sAction, sIdent, sFileOut;
char *sName1, *p_Char1;
long i;
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
sprintf(sFileOut, "%s.mod", g_sFileIn);
if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbFaces);
for(i=0; i<p_stElement->xNbFaces; i++)
{
SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfFacesQuadrupled[i].hFaceMapDescriptor->sName,
sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
if (strstr(sIdent, "!nocol")
|| strstr(sIdent, "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(sIdent);
strcpy(sIdent, sName1);
}
if(stricmp(sFile, sFileOut)==0)
sprintf(sFile, "*");
else
sprintf(sFile, "%s%s.mod", g_sDirectorySave, g_sFileIn);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddFaceFMD, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 9, "%d,%d,%d,%d,%.6f,%.6f,%.6f,%s",
i,
p_stElement->d_stListOfFacesQuadrupled[i].stFaceTripled.a3_xIndex[0],
p_stElement->d_stListOfFacesQuadrupled[i].stFaceTripled.a3_xIndex[1],
p_stElement->d_stListOfFacesQuadrupled[i].stFaceTripled.a3_xIndex[2],
p_stElement->d_stListOfFacesNormals[i].xX,
p_stElement->d_stListOfFacesNormals[i].xY,
p_stElement->d_stListOfFacesNormals[i].xZ,
sSection);
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
for(i=0; i<p_stElement->xNbFaces; i++)
{
MLT_vSaveFaceMapDescriptor(p_stFile, p_stElement->d_stListOfFacesQuadrupled[i].hFaceMapDescriptor);
}
}
/****************************************************************************
* Description: save sprite element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementSprites(SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementSprite *p_stElement)
{
xString sSection, sFile, sAction, sIdent, sFileOut;
char *sName1, *p_Char1;
long i;
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
sprintf(sFileOut, "%s.mod", g_sFileIn);
if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbSprites);
for(i=0; i<p_stElement->xNbSprites; i++)
{
SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfSprites[i].hSprite->sName,
sFile, sAction, sIdent);
if(stricmp(sFile, sFileOut)==0)
sprintf(sFile, "*");
else
sprintf(sFile, "%s%s.mod", g_sDirectorySave, g_sFileIn);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
if (strstr(sIdent, "!nocol")
|| strstr(sIdent, "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(sIdent);
strcpy(sIdent, sName1);
}
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddSprite, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 6, "%d,%d,%.6f,%.6f,%s",
i,
p_stElement->d_stListOfSprites[i].xCenterPoint,
p_stElement->d_stListOfSprites[i].stSize.xX,
p_stElement->d_stListOfSprites[i].stSize.xY,
sSection);
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
for(i=0; i<p_stElement->xNbSprites; i++)
{
MLT_vSaveSprite(p_stFile, p_stElement->d_stListOfSprites[i].hSprite);
}
}
/****************************************************************************
* Description: save line element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementLines(SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementLines *p_stElement)
{
xString sFile, sAction, sIdent;
char *sName1, *p_Char1;
long i;
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbLines);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionThickness, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%.6f", p_stElement->xThickness);
for(i=0; i<p_stElement->xNbLines; i++)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddLine, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%d,%d",
i,
p_stElement->d_stListOfLineIndex[i].a2_xIndex[0],
p_stElement->d_stListOfLineIndex[i].a2_xIndex[1]);
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/****************************************************************************
* Description: save sphere element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementSpheres (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementSpheres *p_stElement)
{
xString sFile, sAction, sIdent;
char *sName1, *p_Char1;
long i;
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbSpheres);
for(i=0; i<p_stElement->xNbSpheres; i++)
{
SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfSpheres[i].sMaterial,
sFile, sAction, sIdent);
sprintf(sFile, "Ed.gmt");
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->d_stListOfSpheres[i].sMaterial,
sFile, M_GameMaterial, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddSphere, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%d,%.6f,%s", i,
p_stElement->d_stListOfSpheres[i].xCenterPoint,
p_stElement->d_stListOfSpheres[i].xRadius,
p_stElement->d_stListOfSpheres[i].sMaterial);
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/****************************************************************************
* Description: save aligned box element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementAlignedBox(SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementAlignedBoxes *p_stElement)
{
xString mes, sFile, sAction, sIdent, sSection, sIdent2;
char *sName1, *p_Char1;
long i, j;
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbAlignedBoxes);
for(i=0; i<p_stElement->xNbAlignedBoxes; i++)
{
SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfAlignedBoxes[i].sMaterial,
sFile, sAction, sIdent);
sprintf(sFile, "%s%s.gmt", g_sDirectorySave, g_sFileMaterial);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_GameMaterial, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddAlignedBox, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%d,%d,%s",
i,
p_stElement->d_stListOfAlignedBoxes[i].xMinPoint,
p_stElement->d_stListOfAlignedBoxes[i].xMaxPoint,
sSection);
SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfAlignedBoxes[i].sMaterial, sFile, sAction, sIdent);
sprintf(sFile, "%s.gmt", g_sFileMaterial);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveGameMaterial, p_stElement->d_stListOfAlignedBoxes[i].hMaterial, SCR_EA_Ntfy_AddOrModifySection);
SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_stListOfAlignedBoxes[i].sMaterial, sFile, sAction, sIdent);
sprintf(sFile, "%s.vmt", g_sFileMaterial);
sprintf(sIdent2, "MAT_%s", sIdent);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Material, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveVisualMaterial, p_stElement->d_stListOfAlignedBoxes[i].hMaterial, SCR_EA_Ntfy_AddOrModifySection);
for(j=0;j<p_stElement->d_stListOfAlignedBoxes[i].hMaterial->lTexture;j++)
{
p_stElement->d_stListOfAlignedBoxes[i].hMaterial->lCurTexture = 0;
sprintf(sFile, "%s.tex", g_sFileMaterial);
sprintf(sIdent2, "TEX_%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(p_stElement->d_stListOfAlignedBoxes[i].hMaterial->sTexture[j]))));
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, p_stElement->d_stListOfAlignedBoxes[i].hMaterial, SCR_EA_Ntfy_AddOrModifySection);
}
// multitextures
for(j=0;j<p_stElement->d_stListOfAlignedBoxes[i].hMaterial->lMultiTexture;j++)
{
p_stElement->d_stListOfAlignedBoxes[i].hMaterial->lCurTexture = 0;
if (!g_bExistTex) //the .tex file doesn't exist
sprintf(sFile, "%s.tex", g_sFileMaterial);
else
{ if (g_bIgnoreTex)
{ if (g_bLevelConversion)
sprintf(sFile, "%s\\World\\levels\\%stemp.tex", g_sGameData, g_sDirectorySave);
if (g_bBankConversion)
sprintf(sFile, "%s\\World\\graphics\\objects\\banks\\%stemp.tex", g_sGameData, g_sDirectorySave);
if (g_bClassConversion)
sprintf(sFile, "%s\\World\\graphics\\objects\\classes\\%stemp.tex", g_sGameData, g_sDirectorySave);
}
else
sprintf(sFile, "%s.tex", g_sFileMaterial);
}
sprintf(sIdent2, "%s", p_stElement->d_stListOfAlignedBoxes[i].hMaterial->stMultiTexture[j].sTexture);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, p_stElement->d_stListOfAlignedBoxes[i].hMaterial, SCR_EA_Ntfy_AddOrModifySection);
}
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/****************************************************************************
* Description: save cone element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementCones(SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementCones *p_stElement)
{
xString sFile, sAction, sIdent;
char *sName1, *p_Char1;
long i;
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbCones);
for(i=0; i<p_stElement->xNbCones; i++)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddCone, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%d,%d,%d", i,
p_stElement->d_stListOfCones[i].xTopPoint,
p_stElement->d_stListOfCones[i].xBasePoint,
p_stElement->d_stListOfCones[i].xBaseRadius);
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/****************************************************************************
* Description: save point element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementPoints (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementPoints *p_stElement)
{
xString mes, sFile, sAction, sIdent;
char *sName1, *p_Char1;
long i;
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->xNbPoints);
sprintf(mes, "%.6f", p_stElement->xFatness);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionFatness, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%.6f", p_stElement->xFatness);
for(i=0; i<p_stElement->xNbPoints; i++)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddPoint, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%d", i, p_stElement->d_xListOfPointIndex[i]);
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/****************************************************************************
* Description: save Mesh element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementTMeshes (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementTMeshes *p_stElement)
{
}
/****************************************************************************
* Description: save Altimap element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementAltimap (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementAltimap *p_stElement)
{
int i, j, k;
char *sName1, *p_Char1;
xString szMes;
xString sFile, sAction, sIdent;
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
// save the parameters for the altimap
if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL"))
{
sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%d,%d,%d",
p_stElement->xNbVertexes,
p_stElement->xNbSquares,
p_stElement->xNbFaces,
p_stElement->xNbElementUV);
//save the origin parameters
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionOrigin, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%.6f,%.6f,%.6f",
p_stElement->stOrigin.xX,
p_stElement->stOrigin.xY,
p_stElement->stOrigin.xZ);
//save the Width, Height, DeltaX, DeltaY for the square
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionSquarePattern, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%.6f,%d,%.6f",
p_stElement->xWidth,
p_stElement->xDeltaX,
p_stElement->xDepth,
p_stElement->xDeltaY);
//for all vertexes save the Z and normals
for(i=0; i<p_stElement->xNbVertexes; i++)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionSetVertex, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 6, "%d,%.6f,%.6f,%.6f,%.6f",
i,
p_stElement->d_xHeight[i],
p_stElement->d_stPointNormals[i].xX,
p_stElement->d_stPointNormals[i].xY,
p_stElement->d_stPointNormals[i].xZ);
}
k=0;
//for every square save the type and the first index triangle for it
for(i=0; i<p_stElement->xNbSquares; i++)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionSetSquare, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%d,%d",
i,
p_stElement->d_stSquare[i].ucType,
p_stElement->d_stSquare[i].xFaceIndex);
//for each triangle of the current square save the index, the normals to faces
//and three indexes for the UV
for (j=0; j< p_stElement->d_stSquare[i].sNbFacesForSquare; j++)
{ SCR_fn_v_RdL0_SplitSectionName(p_stElement->d_hFMD[p_stElement->d_stSquare[i].xFaceIndex+j]->sMaterial, sFile, sAction, sIdent);
sprintf(sFile, "%s%s.gmt", g_sDirectorySave, g_sFileMaterial);
SCR_fn_v_RdL0_ComputeSectionName(szMes, sFile, M_GameMaterial, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionSetTriangle, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 9, "%d,%.6f,%.6f,%.6f,%s,%d,%d,%d",
p_stElement->d_stSquare[i].xFaceIndex+j,
p_stElement->d_stFaceNormals[k].xX,
p_stElement->d_stFaceNormals[k].xY,
p_stElement->d_stFaceNormals[k].xZ,
szMes,
p_stElement->d_hFMD[p_stElement->d_stSquare[i].xFaceIndex+j]->stTrianglesIndexUVValues.a3_xIndex[0],
p_stElement->d_hFMD[p_stElement->d_stSquare[i].xFaceIndex+j]->stTrianglesIndexUVValues.a3_xIndex[1],
p_stElement->d_hFMD[p_stElement->d_stSquare[i].xFaceIndex+j]->stTrianglesIndexUVValues.a3_xIndex[2]
);
k++;
}
}
//save the UVs
for(i=0; i<p_stElement->xNbElementUV; i++)
{
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddUV, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%.6f,%.6f",
i,
p_stElement->d_stUVValues[i].xU,
p_stElement->d_stUVValues[i].xV);
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/****************************************************************************
* Description: save mega face element
*
* Parameters: p_stFile : script file pointer
* p_stElement : element
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveElementMegaFace (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstElementMegaFace *p_stElement)
{
xString sFile, sAction, sIdent;
char *sName1, *p_Char1;
long i, j;
SCR_fn_v_RdL0_SplitSectionName(p_stElement->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(p_stElement->sName, sFile, sAction, sIdent);
if (strstr(MLT_p_cGetSectionName(p_stElement->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(p_stElement->sName), "!NOCOL"))
{
sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(p_stElement->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(p_stElement->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", p_stElement->lNbMegaFaces);
for(i=0; i<p_stElement->lNbMegaFaces; i++)
{
char szParam[256];
char szFace[10];
MLT_tdstMegaFace *p_stMegaFace = &p_stElement->d_stListOfMegaFaces[i];
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddMegaFace, SCR_CC_C_Cfg_NoChar);
sprintf(szParam, "%d", i);
for (j=0; j<p_stMegaFace->lNbFaces; j++)
{
strcat(szParam, ",");
strcat(szParam, itoa(p_stMegaFace->d_stListOfFaces[j], szFace, 10));
}
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%s", szParam);
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/****************************************************************************
* Description: save face map descriptor
*
* Parameters: p_stFile : script file pointer
* hFMD : face map descriptor
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveFaceMapDescriptor (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstFaceMapDescriptor *hFMD)
{
xString mes, sFile, sAction, sIdent, sIdent2;
char *sName1, *p_Char1;
long i;
if(hFMD->AlreadySave == TRUE)
return;
SCR_fn_v_RdL0_SplitSectionName(hFMD->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(hFMD->sName, sFile, sAction, sIdent);
if (strstr(MLT_p_cGetSectionName(hFMD->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(hFMD->sName), "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(hFMD->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(hFMD->sName), SCR_CC_C_Cfg_NoChar);
if(strlen(hFMD->sMaterial) != 0)
{
SCR_fn_v_RdL0_SplitSectionName(hFMD->sMaterial, sFile, sAction, sIdent);
sprintf(sFile, "%s%s.gmt", g_sDirectorySave, g_sFileMaterial);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionMaterial, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, mes);
SCR_fn_v_RdL0_SplitSectionName(hFMD->sMaterial, sFile, sAction, sIdent);
sprintf(sFile, "%s.gmt", g_sFileMaterial);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveGameMaterial, hFMD->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
SCR_fn_v_RdL0_SplitSectionName(hFMD->sMaterial, sFile, sAction, sIdent);
sprintf(sFile, "%s.vmt", g_sFileMaterial);
sprintf(sIdent2, "MAT_%s", sIdent);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Material, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveVisualMaterial, hFMD->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
for(i=0;i<hFMD->hMaterial->lTexture;i++)
{
hFMD->hMaterial->lCurTexture = 0;
sprintf(sFile, "%s.tex", g_sFileMaterial);
sprintf(sIdent2, "TEX_%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(hFMD->hMaterial->sTexture[i]))));
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, hFMD->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
}
// multitextures
for(i=0;i<hFMD->hMaterial->lMultiTexture;i++)
{
hFMD->hMaterial->lCurTexture = 0;
if (!g_bExistTex) //the .tex file doesn't exist
sprintf(sFile, "%s.tex", g_sFileMaterial);
else
{ if (g_bIgnoreTex)
{ if (g_bLevelConversion)
sprintf(sFile, "%s\\World\\levels\\%stemp.tex", g_sGameData, g_sDirectorySave);
if (g_bBankConversion)
sprintf(sFile, "%s\\World\\graphics\\objects\\banks\\%stemp.tex", g_sGameData, g_sDirectorySave);
if (g_bClassConversion)
sprintf(sFile, "%s\\World\\graphics\\objects\\classes\\%stemp.tex", g_sGameData, g_sDirectorySave);
}
else
sprintf(sFile, "%s.tex", g_sFileMaterial);
}
sprintf(sIdent2, "%s", hFMD->hMaterial->stMultiTexture[i].sTexture);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, hFMD->hMaterial, SCR_EA_Ntfy_AddOrModifySection);
}
}
if(strlen(hFMD->sSprObjName) != 0)
{
SCR_fn_v_RdL0_SplitSectionName(hFMD->sSprObjName, sFile, sAction, sIdent);
sprintf(sFile, "%s%s.spo", g_sDirectorySave, g_sFileIn);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, sAction, sIdent);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionPointedSector, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, mes);
}
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionTripledUV, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 7, "%.6f,%.6f,%.6f,%.6f,%.6f,%.6f",
hFMD->stUVValues[0].xU,
hFMD->stUVValues[0].xV,
hFMD->stUVValues[1].xU,
hFMD->stUVValues[1].xV,
hFMD->stUVValues[2].xU,
hFMD->stUVValues[2].xV);
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
hFMD->AlreadySave = TRUE;
}
/****************************************************************************
* Description: save sprite
*
* Parameters: p_stFile : script file pointer
* hSprite : sprite
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSaveSprite (SCRIPT_tdstSaveFile *p_stFile, MLT_tdstSprite *hSprite)
{
xString sSection, sFile, sAction, sIdent, mes, sTypeSprite, sIdent2;
char *sName1, *p_Char1;
long i,j;
if(hSprite->AlreadySave == TRUE)
return;
SCR_fn_v_RdL0_SplitSectionName(hSprite->sName, sFile, sAction, sIdent);
p_Char1=sIdent;
MLT_vRemoveFlags(&p_Char1);
strcpy(sIdent, p_Char1);
p_Char1=sIdent;
MLT_vRemoveGeomProp(&p_Char1);
strcpy(sIdent, p_Char1);
SCR_fn_v_RdL0_ComputeSectionName(hSprite->sName, sFile, sAction, sIdent);
if (strstr(MLT_p_cGetSectionName(hSprite->sName), "!nocol")
|| strstr(MLT_p_cGetSectionName(hSprite->sName), "!NOCOL"))
{ sName1 = MLT_vRemoveFromName(MLT_p_cGetSectionName(hSprite->sName));
SCR_M_SvL0_SaveBeginSection(p_stFile, sName1, SCR_CC_C_Cfg_NoChar);
}
else
SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(hSprite->sName), SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", hSprite->xNbSprites);
for(i=0; i<hSprite->xNbSprites; i++)
{
SCR_fn_v_RdL0_SplitSectionName(hSprite->d_sMaterial[i], sFile, sAction, sIdent);
sprintf(sFile, "%s%s.gmt", g_sDirectorySave, g_sFileMaterial);
SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_GameMaterial, sIdent);
sprintf(mes, "%d,%s", i, sSection);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddMaterial, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%s", i, sSection);
if(hSprite->d_xSpriteDrawMode[i] == MLT_C_lSpriteDrawMode2DScaled)
sprintf(sTypeSprite, M_2DScaled);
else if(hSprite->d_xSpriteDrawMode[i] == 0)
sprintf(sTypeSprite, M_2DNonScaled);
else
sprintf(sTypeSprite, M_2DNonScaled);
SCR_M_SvL0_SaveEntry(p_stFile, M_MODActionAddInfo, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 8, "%d,%s,%.6f,%.6f,%.6f,%.6f,%.6f",
i,
sTypeSprite,
hSprite->d_xThresholds[i],
hSprite->d_xSizeOfSprite[i].xX,
hSprite->d_xSizeOfSprite[i].xY,
hSprite->d_xDisplacementOfSprite[i].xX,
hSprite->d_xDisplacementOfSprite[i].xY);
SCR_fn_v_RdL0_SplitSectionName(hSprite->d_sMaterial[i], sFile, sAction, sIdent);
sprintf(sFile, "%s.gmt", g_sFileMaterial);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_GameMaterial, sIdent);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveGameMaterial, hSprite->d_hMaterial[i], SCR_EA_Ntfy_AddOrModifySection);
SCR_fn_v_RdL0_SplitSectionName(hSprite->d_sMaterial[i], sFile, sAction, sIdent);
sprintf(sFile, "%s.vmt", g_sFileMaterial);
sprintf(sIdent2, "MAT_%s", sIdent);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Material, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveVisualMaterial, hSprite->d_hMaterial[i], SCR_EA_Ntfy_AddOrModifySection);
for(j=0;j<hSprite->d_hMaterial[i]->lTexture;j++)
{
hSprite->d_hMaterial[i]->lCurTexture = 0;
sprintf(sFile, "%s.tex", g_sFileMaterial);
sprintf(sIdent2, "TEX_%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(hSprite->d_hMaterial[i]->sTexture[j]))));
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, hSprite->d_hMaterial[i], SCR_EA_Ntfy_AddOrModifySection);
}
// multitextures
for(j=0;j<hSprite->d_hMaterial[i]->lMultiTexture;j++)
{
hSprite->d_hMaterial[i]->lCurTexture = 0;
if (!g_bExistTex) //the .tex file doesn't exist
sprintf(sFile, "%s.tex", g_sFileMaterial);
else
{ if (g_bIgnoreTex)
{ if (g_bLevelConversion)
sprintf(sFile, "%s\\World\\levels\\%stemp.tex", g_sGameData, g_sDirectorySave);
if (g_bBankConversion)
sprintf(sFile, "%s\\World\\graphics\\objects\\banks\\%stemp.tex", g_sGameData, g_sDirectorySave);
if (g_bClassConversion)
sprintf(sFile, "%s\\World\\graphics\\objects\\classes\\%stemp.tex", g_sGameData, g_sDirectorySave);
}
else
sprintf(sFile, "%s.tex", g_sFileMaterial);
}
sprintf(sIdent2, "%s", hSprite->d_hMaterial[i]->stMultiTexture[j].sTexture);
SCR_fn_v_RdL0_ComputeSectionName(mes, sFile, M_Texture, sIdent2);
SCR_fn_v_SvL1_RegisterNotify(mes, MLT_vSaveTexture, hSprite->d_hMaterial[i], SCR_EA_Ntfy_AddOrModifySection);
}
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
hSprite->AlreadySave = TRUE;
}
/****************************************************************************
* Description: test if the vertexes from a geometric object are symmetric with a plane
*
* Parameters: p_stGeometric : geometric object
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
BOOL MLT_bTestSymmetry(MLT_tdstGeometricObject *p_stGeometric)
{
long i;
MTH3D_tdstVector stValues;
for (i=0; i<p_stGeometric->xNbPoints; i++)
{
//symetric with plane yoz
if ((p_stGeometric->cGeom == 'x') || (p_stGeometric->cGeom == 'X'))
{
stValues.xX = (float)(2*p_stGeometric->fGeom) - p_stGeometric->d_stListOfPoints[i].xX;
stValues.xY = p_stGeometric->d_stListOfPoints[i].xY;
stValues.xZ = p_stGeometric->d_stListOfPoints[i].xZ;
}
//symetric with plane xoz
if ((p_stGeometric->cGeom == 'y') || (p_stGeometric->cGeom == 'Y'))
{
stValues.xX = p_stGeometric->d_stListOfPoints[i].xX;
stValues.xY = (float)(2*p_stGeometric->fGeom) - p_stGeometric->d_stListOfPoints[i].xY;
stValues.xZ = p_stGeometric->d_stListOfPoints[i].xZ;
}
//symetric with plane xoy
if ((p_stGeometric->cGeom == 'z') || (p_stGeometric->cGeom == 'Z'))
{
stValues.xX = p_stGeometric->d_stListOfPoints[i].xX;
stValues.xY = p_stGeometric->d_stListOfPoints[i].xY;
stValues.xZ = (float)(2*p_stGeometric->fGeom) - p_stGeometric->d_stListOfPoints[i].xZ;
}
if (!MLT_bFindVertex(p_stGeometric, stValues))
return FALSE;
}
return TRUE;
}
/****************************************************************************
* Description: check if the vertex belong to the object
*
* Parameters: p_stGeometric : geometric object
* stValues : vertex
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
BOOL MLT_bFindVertex (MLT_tdstGeometricObject *p_stGeometric, MTH3D_tdstVector stValues)
{
long i;
for (i=0; i<p_stGeometric->xNbPoints; i++)
{
//for all the points for the geometric object
if ((fabs(stValues.xX - p_stGeometric->d_stListOfPoints[i].xX )<=g_fLimit2)
&&(fabs(stValues.xY- p_stGeometric->d_stListOfPoints[i].xY )<=g_fLimit2)
&&(fabs(stValues.xZ - p_stGeometric->d_stListOfPoints[i].xZ )<=g_fLimit2))
return TRUE;
}
return FALSE;
}