/*========================================================================= * * 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; ilNbFaces; 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; liCountd_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; }