/************** LOAD.C Ver 2.1 ***************/ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ #include #include "cpa_std.h" #include "Acp_Base.h" #include "GLD.h" #include "GLI_st.h" #include "vertex.h" #include "GLI_Defn.h" #include "material.h" #include "load.h" #include "textu_st.h" #include "texture.h" #include "TexProcedural.h" #include "ErrGEO.h" #include "MmgGEO.h" #include "LinkTab.h" #include "scr.h" #include "TEX.h" #include "GEO.h" /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ #ifdef __cplusplus extern "C" { #endif char szTexturePath[_MAX_PATH]; // FBF N64-format pour coords, et logfile dans x:\exe\geodump.log{ #ifdef U64CONVERTETLOG extern float fScale; extern BOOL g_bLoadMap; FILE *dump = NULL; #endif //U64CONVERTLOG // } fin N64-format /* ======================================================================================= Access function to texture path ======================================================================================= */ /******************************************************************** Set the texture's path *********************************************************************/ void GLI_vSetPathOfTexture(char *szLoadPath) { long len; assert(szLoadPath != NULL); len = sprintf(szTexturePath,"%s",szLoadPath); if( (szTexturePath[len-1] == '\\') || (szTexturePath[len-1] == '/') ) szTexturePath[len-1] = 0; } /******************************************************************** Get the texture's path by copy *********************************************************************/ void GLI_vGetPathOfTexture(char *szLoadPath) { assert(szLoadPath != NULL); strcpy(szLoadPath, szTexturePath); } /******************************************************************** Get the texture's path by pointer *********************************************************************/ char *GLI_fn_szGetPathOfTexture(void) { return(szTexturePath); } /******************************************************************** Build texture file name *********************************************************************/ BOOL GLI_bGetTextureName(char *szName, char *szTexture) { sprintf(szTexture,"%s/%s",szTexturePath,szName); return (TRUE); } /* ======================================================================================= callback to load object elements ======================================================================================= */ /******************************************************************** Load an indexed triangle element *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadElementIndexedTriangles(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { long xIndex; GEO_tdstElementIndexedTriangles *p_stElement; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: p_stElement = GEO_p_stAllocElementIndexedTriangles( (ACP_tdxIndex)atoi(szParams[0]), (ACP_tdxIndex)atoi(szParams[1]) ); SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement); SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfElementIndexedTriangle(), a255_cLongName, (unsigned long)p_stElement), 1,strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); // FBF N64-format pour coords, et logfile dans x:\exe\geodump.log{ #ifdef U64CONVERTETLOG if (g_bLoadMap) { fprintf (dump,"===================================================================\n"); fprintf (dump,"%s\n",a255_cLongName); fflush(dump); } #endif //U64CONVERTLOG // } fin N64-format break; case SCR_EA_Anl_Entry: /* Recuperation du p_stElement a remplir*/ SCR_M_RdL0_GetContextLong(0,0,GEO_tdstElementIndexedTriangles*,p_stElement); /* Loading of Face*/ if (strcmp(szAction,"AddFaceUV")==0) { xIndex = (long)atoi(szParams[0]); p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[0]=(ACP_tdxIndex)(atoi(szParams[1])); p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[1]=(ACP_tdxIndex)(atoi(szParams[2])); p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[2]=(ACP_tdxIndex)(atoi(szParams[3])); MTH3D_M_vSetVectorElements ( (p_stElement->d_stListOfFacesNormals+xIndex), MTH_M_xDoubleToReal(atof(szParams[4])), MTH_M_xDoubleToReal(atof(szParams[5])), MTH_M_xDoubleToReal(atof(szParams[6])) ); /* if (g_bLoadMap) { // round u64 (p_stElement->d_stListOfFacesNormals+xIndex)->xX = (float) (( (long)( ((p_stElement->d_stListOfFacesNormals+xIndex)->xX*fScale) + 0.5) ) / fScale); (p_stElement->d_stListOfFacesNormals+xIndex)->xY = (float) (( (long)( ((p_stElement->d_stListOfFacesNormals+xIndex)->xY*fScale) + 0.5) ) / fScale); (p_stElement->d_stListOfFacesNormals+xIndex)->xZ = (float) (( (long)( ((p_stElement->d_stListOfFacesNormals+xIndex)->xZ*fScale) + 0.5) ) / fScale); fprintf (dump,"loaded face normal %03d : x=%f,y=%f,z=%f\n",xIndex,(p_stElement->d_stListOfFacesNormals+xIndex)->xX,(p_stElement->d_stListOfFacesNormals+xIndex)->xY,(p_stElement->d_stListOfFacesNormals+xIndex)->xZ); fflush(dump); } */ p_stElement->d_stListOfFacesTripledIndexUV[xIndex].a3_xIndex[0]=(ACP_tdxIndex)(atoi(szParams[7])); p_stElement->d_stListOfFacesTripledIndexUV[xIndex].a3_xIndex[1]=(ACP_tdxIndex)(atoi(szParams[8])); p_stElement->d_stListOfFacesTripledIndexUV[xIndex].a3_xIndex[2]=(ACP_tdxIndex)(atoi(szParams[9])); } else if (strcmp(szAction,"AddFace")==0) { xIndex = (long)atoi(szParams[0]); p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[0]=(ACP_tdxIndex)(atoi(szParams[1])); p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[1]=(ACP_tdxIndex)(atoi(szParams[2])); p_stElement->d_stListOfFacesTripled[xIndex].a3_xIndex[2]=(ACP_tdxIndex)(atoi(szParams[3])); MTH3D_M_vSetVectorElements ( (p_stElement->d_stListOfFacesNormals+xIndex),MTH_M_xDoubleToReal(atof(szParams[4])), MTH_M_xDoubleToReal(atof(szParams[5])),MTH_M_xDoubleToReal(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); } else if (strcmp(szAction,"GetFaces")==0) { GEO_tdstElementIndexedTriangles *p_stTemp; SCR_tdst_Cxt_Values *p_stVal; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); p_stTemp = (GEO_tdstElementIndexedTriangles*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(p_stTemp != NULL); GEO_M_CPAFree(p_stElement->d_stListOfFacesTripled); GEO_M_CPAFree(p_stElement->d_stListOfFacesNormals); GEO_M_CPAFree(p_stElement->d_stListOfFacesTripledIndexUV); p_stElement->d_stListOfFacesTripled = p_stTemp->d_stListOfFacesTripled; p_stElement->d_stListOfFacesNormals = p_stTemp->d_stListOfFacesNormals; p_stElement->d_stListOfFacesTripledIndexUV = p_stTemp->d_stListOfFacesTripledIndexUV; } else if (strcmp(szAction,"AddUV")==0) { xIndex = (long)atoi(szParams[0]); p_stElement->d_stListOfElementUV[xIndex].xU=(GLI_tdxUVValue)(atof(szParams[1])); p_stElement->d_stListOfElementUV[xIndex].xV=(GLI_tdxUVValue)(atof(szParams[2])); } else if (strcmp(szAction,"GetUVs")==0) { GEO_tdstElementIndexedTriangles *p_stTemp; SCR_tdst_Cxt_Values *p_stVal; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); p_stTemp = (GEO_tdstElementIndexedTriangles*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(p_stTemp != NULL); GEO_M_CPAFree(p_stElement->d_stListOfElementUV); p_stElement->d_stListOfElementUV = p_stTemp->d_stListOfElementUV; } else if( (strcmp(szAction,"Material")==0) || (strcmp (szAction,"PointedSector")==0) ) { SCR_tdst_Cxt_Values *p_stVal; char sFile[256], sAction[256], sIdent[256]; /* Sector*/ if(strcmp(szAction,"PointedSector") == 0) { SCR_tdst_Link_Value *p_stRemoveValue; /* Add the element into a special list of frontier elements */ SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfFrontierElement(), a255_cLongName, (unsigned long)p_stElement), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); /* Remove it from the normal list of indexed triangles */ p_stRemoveValue=SCR_fnp_st_Link_SearchValue(GLI_p_stGetLinkTableOfElementIndexedTriangle(), (unsigned long)p_stElement); SCR_fn_v_Link_DeleteEntry(GLI_p_stGetLinkTableOfElementIndexedTriangle(),p_stRemoveValue); /* Analyse the pointed sector */ p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); p_stElement->hMaterial = (GMT_tdxHandleToGameMaterial)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); } else { SCR_fn_v_RdL0_SplitSectionName(szParams[0], sFile, sAction, sIdent); if(strcmp(sAction,"Material") == 0) { /* material */ ACP_tdxHandleOfMaterial hMat; GMT_tdxHandleToGameMaterial hGameMat; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); hMat = (ACP_tdxHandleOfMaterial)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); hGameMat = GMT_fn_hCreateGameMaterial(); GMT_fn_vSetVisualMaterial(hGameMat, hMat); p_stElement->hMaterial = hGameMat; } else { /* game material */ p_stElement->hMaterial=GMT_fn_hLoadGameMaterial(szParams[0]); } } } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** Load a TMesh element *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadElementTMeshes(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { return SCR_ERV_Anl_NormalReturn; } /******************************************************************** Load a FaceMapDescriptor element *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadElementFaceMapDescriptors(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { long xIndex; GEO_tdstElementFaceMapDescriptors *p_stElement; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: p_stElement = GEO_p_stAllocElementFaceMap( (ACP_tdxIndex)atoi(szParams[0]) ); SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement); SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfElementFaceMapDescriptor(), a255_cLongName, (unsigned long)p_stElement), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); break; case SCR_EA_Anl_Entry: /* Recuperation du p_stElement a remplir*/ SCR_M_RdL0_GetContextLong(0,0,GEO_tdstElementFaceMapDescriptors*,p_stElement); /* Loading of Face*/ if (strcmp(szAction,"AddFaceFMD")==0) { ACP_tdxHandleOfFMD hFaceMapDescriptor; SCR_tdst_Cxt_Values *p_stVal; xIndex = (long)atoi(szParams[0]); p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[7], SCR_CDF_uw_Anl_Normal); hFaceMapDescriptor = (ACP_tdxHandleOfFMD)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(hFaceMapDescriptor != NULL); p_stElement->d_stListOfFacesQuadrupled[xIndex].stFaceTripled.a3_xIndex[0]=(ACP_tdxIndex)(atoi(szParams[1])); p_stElement->d_stListOfFacesQuadrupled[xIndex].stFaceTripled.a3_xIndex[1]=(ACP_tdxIndex)(atoi(szParams[2])); p_stElement->d_stListOfFacesQuadrupled[xIndex].stFaceTripled.a3_xIndex[2]=(ACP_tdxIndex)(atoi(szParams[3])); p_stElement->d_stListOfFacesQuadrupled[xIndex].hFaceMapDescriptor = hFaceMapDescriptor; MTH3D_M_vSetVectorElements((p_stElement->d_stListOfFacesNormals+xIndex), MTH_M_xDoubleToReal(atof(szParams[4])), MTH_M_xDoubleToReal(atof(szParams[5])), MTH_M_xDoubleToReal(atof(szParams[6])) ); } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** Load a sprite element *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadElementSprites(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { long xIndex; GEO_tdstElementSprite *p_stElement; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: p_stElement = GEO_p_stAllocElementSprite( (ACP_tdxIndex)atoi(szParams[0]) ); SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement); SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfElementSprite(), a255_cLongName, (unsigned long)p_stElement), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); break; case SCR_EA_Anl_Entry: /* Recuperation du p_stElement a remplir*/ SCR_M_RdL0_GetContextLong(0,0,GEO_tdstElementSprite*,p_stElement) /* Loading of Face*/ if (strcmp(szAction,"AddSprite")==0) { ACP_tdxHandleOfSprite hSprite; SCR_tdst_Cxt_Values *p_stVal; xIndex = (long)atoi(szParams[0]); p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[4], SCR_CDF_uw_Anl_Normal); hSprite = (ACP_tdxHandleOfSprite)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(hSprite != NULL); p_stElement->d_stListOfSprites[xIndex].xCenterPoint=(ACP_tdxIndex)(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=hSprite; } else if (strcmp(szAction,"AddRotationAxe")==0) { xIndex = (long)atoi(szParams[0]); p_stElement->d_stListOfSprites[xIndex].stAxe.xX = (MTH_tdxReal)(atof(szParams[1])); p_stElement->d_stListOfSprites[xIndex].stAxe.xY = (MTH_tdxReal)(atof(szParams[2])); p_stElement->d_stListOfSprites[xIndex].stAxe.xZ = (MTH_tdxReal)(atof(szParams[3])); } else if (strcmp(szAction,"AddUV")==0) { xIndex = (long)atoi(szParams[0]); p_stElement->d_stListOfSprites[xIndex].stUVpos.xU = (MTH_tdxReal)(atof(szParams[1])); p_stElement->d_stListOfSprites[xIndex].stUVpos.xV = (MTH_tdxReal)(atof(szParams[2])); p_stElement->d_stListOfSprites[xIndex].stUVsize.xU = (MTH_tdxReal)(atof(szParams[3])); p_stElement->d_stListOfSprites[xIndex].stUVsize.xV = (MTH_tdxReal)(atof(szParams[4])); } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** Load a line element *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadElementLines(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { long xIndex; GEO_tdstElementLines *p_stElement; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: p_stElement = GEO_p_stAllocElementLines( (ACP_tdxIndex)atoi(szParams[0]) ); SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement); SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfElementLine(), a255_cLongName, (unsigned long)p_stElement), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); break; case SCR_EA_Anl_Entry: /* Recuperation du p_stElement a remplir*/ SCR_M_RdL0_GetContextLong(0,0,GEO_tdstElementLines*,p_stElement); /* Loading of Line*/ if (strcmp(szAction,"AddLine")==0) { xIndex = (long)atoi(szParams[0]); p_stElement->d_stListOfLineIndex[xIndex].a2_xIndex[0]=(ACP_tdxIndex)(atoi(szParams[1])); p_stElement->d_stListOfLineIndex[xIndex].a2_xIndex[1]=(ACP_tdxIndex)(atoi(szParams[2])); } else if (strcmp(szAction,"GetLines")==0) { GEO_tdstElementLines *p_stTemp; SCR_tdst_Cxt_Values *p_stVal; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); p_stTemp = (GEO_tdstElementLines*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(p_stTemp != NULL); GEO_M_CPAFree(p_stElement->d_stListOfLineIndex); p_stElement->d_stListOfLineIndex = p_stTemp->d_stListOfLineIndex; } else if (strcmp(szAction,"Thickness")==0) { p_stElement->xThickness = (MTH_tdxReal)(atof(szParams[0])); } else if (strcmp(szAction,"GetThickness")==0) { GEO_tdstElementLines *p_stTemp; SCR_tdst_Cxt_Values *p_stVal; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); p_stTemp = (GEO_tdstElementLines*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(p_stTemp != NULL); p_stElement->xThickness = p_stTemp->xThickness; } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** Load a sphere element *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadElementSpheres(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { long xIndex; GEO_tdstElementSpheres *p_stElement; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: p_stElement = GEO_p_stAllocElementSpheres( (ACP_tdxIndex)atoi(szParams[0]) ); SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement); SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfElementSphere(), a255_cLongName, (unsigned long)p_stElement), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); break; case SCR_EA_Anl_Entry: /* Recuperation du p_stElement a remplir*/ SCR_M_RdL0_GetContextLong(0,0,GEO_tdstElementSpheres*,p_stElement); /* Loading of Face*/ if (strcmp(szAction,"AddSphere")==0) { GMT_tdxHandleToGameMaterial hMaterial; xIndex = (long)atoi(szParams[0]); hMaterial=GMT_fn_hLoadGameMaterial(szParams[3]); assert(hMaterial != NULL); p_stElement->d_stListOfSpheres[xIndex].xCenterPoint=(ACP_tdxIndex)(atoi(szParams[1])); p_stElement->d_stListOfSpheres[xIndex].xRadius=(MTH_tdxReal)(GLI_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName)*atof(szParams[2])); p_stElement->d_stListOfSpheres[xIndex].hMaterial = hMaterial; } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** Load alignedbox element *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadElementAlignedBoxes(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { long xIndex; GEO_tdstElementAlignedBoxes *p_stElement; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: p_stElement = GEO_p_stAllocElementAlignedBoxes( (ACP_tdxIndex)atoi(szParams[0]) ); SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement); SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfElementAlignedBoxe(), a255_cLongName, (unsigned long)p_stElement), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); break; case SCR_EA_Anl_Entry: /* Recuperation du p_stElement a remplir*/ SCR_M_RdL0_GetContextLong(0,0,GEO_tdstElementAlignedBoxes*,p_stElement); /* Loading of Line*/ if (strcmp(szAction,"AddAlignedBox")==0) { GMT_tdxHandleToGameMaterial hMaterial; xIndex = (long)atoi(szParams[0]); hMaterial=GMT_fn_hLoadGameMaterial(szParams[3]); assert(hMaterial != NULL); p_stElement->d_stListOfAlignedBoxes[xIndex].xMinPoint=(ACP_tdxIndex)(atoi(szParams[1])); p_stElement->d_stListOfAlignedBoxes[xIndex].xMaxPoint=(ACP_tdxIndex)(atoi(szParams[2])); p_stElement->d_stListOfAlignedBoxes[xIndex].hMaterial = hMaterial; } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** Load Point element *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadElementPoints(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { ACP_tdxIndex xIndex; GEO_tdstElementPoints *p_stElement; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: p_stElement = GEO_p_stAllocElementPoints( (ACP_tdxIndex)atoi(szParams[0]) ); SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement); SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfElementPoint(), a255_cLongName, (unsigned long)p_stElement), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); break; case SCR_EA_Anl_Entry: /* Recuperation du p_stElement a remplir*/ SCR_M_RdL0_GetContextLong(0,0,GEO_tdstElementPoints*,p_stElement); /* Loading of Line*/ if (strcmp(szAction,"AddPoint")==0) { xIndex = (ACP_tdxIndex)atoi(szParams[0]); p_stElement->d_xListOfPointIndex[xIndex]=(ACP_tdxIndex)(atoi(szParams[1])); } else if (strcmp(szAction,"GetPoints")==0) { GEO_tdstElementPoints *p_stTemp; SCR_tdst_Cxt_Values *p_stVal; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); p_stTemp = (GEO_tdstElementPoints*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(p_stTemp != NULL); GEO_M_CPAFree(p_stElement->d_xListOfPointIndex); p_stElement->d_xListOfPointIndex = p_stTemp->d_xListOfPointIndex; } else if (strcmp(szAction,"Fatness")==0) { p_stElement->xFatness = (MTH_tdxReal)(atof(szParams[0])); } else if (strcmp(szAction,"GetFatness")==0) { GEO_tdstElementPoints *p_stTemp; SCR_tdst_Cxt_Values *p_stVal; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); p_stTemp = (GEO_tdstElementPoints*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(p_stTemp != NULL); p_stElement->xFatness = p_stTemp->xFatness; } else if( strcmp(szAction,"GameMaterial")==0 ) { p_stElement->hMaterial = GMT_fn_hLoadGameMaterial(szParams[0]); if( GMT_fn_hGetVisualMaterial(p_stElement->hMaterial)==NULL ) { ACP_tdxHandleOfMaterial hVisualMat; GLI_xCreateMaterial(&hVisualMat); GMT_fn_vSetVisualMaterial(p_stElement->hMaterial,hVisualMat); } } break; case SCR_EA_Anl_EndSection: SCR_M_RdL0_GetContextLong(0,0,GEO_tdstElementPoints*,p_stElement); if( p_stElement->hMaterial==NULL ) { ACP_tdxHandleOfMaterial hVisualMat; p_stElement->hMaterial=GMT_fn_hCreateGameMaterial(); GLI_xCreateMaterial(&hVisualMat); GMT_fn_vSetVisualMaterial(p_stElement->hMaterial,hVisualMat); } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** Load a Cone Element *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadElementCones(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { long xIndex; GEO_tdstElementCones *p_stElement; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: p_stElement = GEO_p_stAllocElementCones( (ACP_tdxIndex)atoi(szParams[0]) ); SCR_M_RdL0_SetSectionLong(0,0,(long)p_stElement); SCR_M_RdL0_SetContextLong(0,0,(long)p_stElement); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfElementCone(), a255_cLongName, (unsigned long)p_stElement), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); break; case SCR_EA_Anl_Entry: /* Recuperation du p_stElement a remplir*/ SCR_M_RdL0_GetContextLong(0,0,GEO_tdstElementCones*,p_stElement); /* Loading of Line*/ if (strcmp(szAction,"AddCone")==0) { GMT_tdxHandleToGameMaterial hMaterial; SCR_tdst_Cxt_Values *p_stVal; xIndex = (long)atoi(szParams[0]); if(SCR_fn_uc_RdL0_GetNumberOfParameters(szParams) == 5) { if(strstr(szParams[4],"GameMaterial") == NULL) /* VisualMaterial*/ { ACP_tdxHandleOfMaterial hMat; GMT_tdxHandleToGameMaterial hGameMat; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[4], SCR_CDF_uw_Anl_Normal); hMat = (ACP_tdxHandleOfMaterial)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); hGameMat = GMT_fn_hCreateGameMaterial(); GMT_fn_vSetVisualMaterial(hGameMat, hMat); hMaterial = hGameMat; } else hMaterial = GMT_fn_hLoadGameMaterial(szParams[4]); assert(hMaterial != NULL); } else hMaterial = NULL; p_stElement->d_stListOfCones[xIndex].xTopPoint=(ACP_tdxIndex)(atoi(szParams[1])); p_stElement->d_stListOfCones[xIndex].xBasePoint=(ACP_tdxIndex)(atoi(szParams[2])); p_stElement->d_stListOfCones[xIndex].xBaseRadius=MTH_M_xDoubleToReal(atof(szParams[3]) * GLI_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName)); p_stElement->d_stListOfCones[xIndex].hMaterial = hMaterial; } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** Load a visual material *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadMaterial(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ ACP_tdxHandleOfMaterial hVisualMat; GEO_tdstColor stColor; long localType; char a255_cLongName[255]; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ switch (cType) { case SCR_EA_Anl_BeginSection: GLI_xCreateMaterial(&hVisualMat); SCR_M_RdL0_SetSectionLong(0,0,(long)hVisualMat); SCR_M_RdL0_SetContextLong(0,0,(long)hVisualMat); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfVisualMaterial(), a255_cLongName, (unsigned long)hVisualMat), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); /*GLI_vSetMaterialName ( hVisualMat, szAction);*/ break; case SCR_EA_Anl_Entry: /* Recuperation du materiau a remplir*/ SCR_M_RdL0_GetContextLong(0,0,ACP_tdxHandleOfMaterial,hVisualMat); /* Loading of material type*/ if (strcmp(szAction,"Type")==0) { if(strcmp(szParams[0], "Gouraud")==0) GLI_xSetMaterialType(hVisualMat, C_lGouraudElement); else if(strcmp(szParams[0], "Flat")==0) GLI_xSetMaterialType(hVisualMat, C_lGouraudElement - GLI_C_lIsGouraud); else if(strcmp(szParams[0], "GouraudAlpha")==0) GLI_xSetMaterialType(hVisualMat, C_lGouraudElement - GLI_C_lIsNotGrided - GLI_C_lIsNotLightAlphaSensitive); else if(strcmp(szParams[0], "Transparent")==0) GLI_xSetMaterialType(hVisualMat, C_lGouraudElement - GLI_C_lIsNotGrided ); } else if (strcmp(szAction,"AmbientColor")==0) { stColor.xR = (float)atof(szParams[0]); stColor.xG = (float)atof(szParams[1]); stColor.xB = (float)atof(szParams[2]); stColor.xA = (szParams[3]) ? (float)atof(szParams[3]) : 1.0f; GLI_xSetMaterialAmbientCoef(hVisualMat, &stColor); } else if (strcmp(szAction,"DiffuseColor")==0) { stColor.xR = (float)atof(szParams[0]); stColor.xG = (float)atof(szParams[1]); stColor.xB = (float)atof(szParams[2]); stColor.xA = (szParams[3]) ? (float)atof(szParams[3]) : 1.0f; GLI_xSetMaterialDiffuseCoef(hVisualMat, &stColor); } else if (strcmp(szAction,"SpecularColor")==0) { stColor.xR = (float)atof(szParams[0]); stColor.xG = (float)atof(szParams[1]); stColor.xB = (float)atof(szParams[2]); stColor.xA = (szParams[3]) ? (float)atof(szParams[3]) : 1.0f; GLI_xSetMaterialSpecularCoef( hVisualMat, (szParams[4]) ? atol(szParams[4]) : 100, &stColor ); } else if (strcmp(szAction,"Texture")==0) { char a_cFullName[255]; GLI_tdstTexture *p_stTexture; if( GLI_bGetTextureName(szParams[0], a_cFullName) ) { long localType; #ifdef EXGEOM_APPLI { char szRealName[ _MAX_PATH ]; extern long EXGEOM_TEX_fnl_FindTexture( char *, char *); if (EXGEOM_TEX_fnl_FindTexture( szParams[0], szRealName ) ) GLI_xLoadTexture(&p_stTexture,NULL,szRealName,0,0); else GLI_xLoadTexture(&p_stTexture,NULL,szParams[0],0,0); } #else GLI_xLoadTexture(&p_stTexture,NULL,szParams[0],0,0); #endif if (p_stTexture==NULL) { GLI_xSetMaterialType(hVisualMat, C_lGouraudElement); break; } if (szParams[1] && szParams[2]) { GLI_xSetMaterialTextureScrollingCoef( hVisualMat , 0 , 1 , (float)atof(szParams[1]),(float)atof(szParams[2])); } SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfTexture(), a_cFullName, (unsigned long)p_stTexture), 1, strlen(a_cFullName) - strlen(szParams[0]) ); GLI_xGetMaterialType(hVisualMat, &localType); localType |= GLI_C_lIsTextured; GLI_xSetMaterialType(hVisualMat, localType); GLI_xSetMaterialTexture(hVisualMat, p_stTexture); } } else if (strcmp(szAction,"Scroll")==0) { GLI_xSetMaterialTextureScrollingCoef( hVisualMat , 0 , 1 , (float)atof(szParams[1]),(float)atof(szParams[2])); } else if (strcmp(szAction,"Texture1")==0) { char a_cFullName[255]; char a_cFullNameMipMap[255]; long lNbLoD,lLodCounter; GLI_tdstTexture *p_stTexture; if( GLI_bGetTextureName(szParams[0], a_cFullName) ) { GLI_xLoadTexture(&p_stTexture,NULL,szParams[0],0,atol(szParams[1])); if (p_stTexture==NULL) { GLI_xSetMaterialType(hVisualMat, C_lGouraudElement); break; } if (strcmp(szParams[2],"AUTO") == 0) { GLI_vComputeLod(p_stTexture); } else { if (atol(szParams[2])>0) { lNbLoD = atol(szParams[2]); for (lLodCounter = 0 ; lLodCounter < lNbLoD ; lLodCounter ++ ) { if (GLI_bGetTextureName(szParams[lLodCounter + 3], a_cFullNameMipMap)) GLI_vLoadLodAndAddItToTexture(p_stTexture,NULL,szParams[lLodCounter + 3],0,0); } } } SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfTexture(), a_cFullName, (unsigned long)p_stTexture), 1, strlen(a_cFullName) - strlen(szParams[0]) ); GLI_xGetMaterialType(hVisualMat, &localType); localType |= GLI_C_lIsTextured; GLI_xSetMaterialType(hVisualMat, localType); GLI_xSetMaterialTexture(hVisualMat, p_stTexture); } } else if (strcmp(szAction,"AddTexture")==0) { GLI_tdstTexture *p_stTexture; ACP_tdxIndex xIndex; SCR_tdst_Cxt_Values *p_stVal; xIndex = atoi(szParams[0]); p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[1], SCR_CDF_uw_Anl_Normal); p_stTexture = (GLI_tdstTexture *) SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); GLI_xGetMaterialType(hVisualMat, &localType); localType |= GLI_C_lIsTextured; GLI_xSetMaterialType(hVisualMat, localType); if (szParams[2]) GLI_vAddMaterialAnimatedTexture(hVisualMat, 0xffffff ,p_stTexture,MTH_M_xDoubleToFloat(atof(szParams[2]))); else { if (xIndex == 0) GLI_xSetMaterialTexture(hVisualMat, p_stTexture); /*VLMT*/ //GLI_Material_fn_lSetTexture( hVisualMat, xIndex, p_stTexture ); } } /*VLMT*/ #ifdef MULTI_TEXTURE else if (strcmp( szAction, "MultiTexture") == 0) { GLI_tdstTexture *p_stTexture; ACP_tdxIndex xIndex; SCR_tdst_Cxt_Values *p_stVal; xIndex = atoi(szParams[0]); p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[2], SCR_CDF_uw_Anl_Normal); p_stTexture = (GLI_tdstTexture *) SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); GLI_xGetMaterialType(hVisualMat, &localType); localType |= GLI_C_lIsTextured; GLI_xSetMaterialType(hVisualMat, localType); if (xIndex == 0) GLI_xSetMaterialTexture(hVisualMat, p_stTexture); GLI_Material_fn_lSetTexture( hVisualMat, xIndex, p_stTexture ); GLI_Material_fn_lSetTextureOpWithString( hVisualMat, xIndex, szParams[3] ); } else if (strcmp( szAction, "UVComputing") == 0) { long lCanal; float su, sv, alpha, speedalpha, du, dv, speedu, speedv; lCanal = atoi( szParams[ 0 ] ); speedu = (float) atof( szParams[ 2 ] ); du = (float) atof( szParams[ 3 ] ); speedv = (float) atof( szParams[ 4 ] ); dv = (float) atof( szParams[ 5 ] ); speedalpha = (float) atof( szParams[ 6 ] ); alpha = (float) atof( szParams[ 7 ] ); su = (float) atof( szParams[ 8 ] ); sv = (float) atof( szParams[ 9 ] ); GLI_Material_fn_lSetUVFuncWithString( hVisualMat, lCanal, szParams[1], su, sv, speedalpha, alpha, speedu, speedv, du, dv ); } #endif /*EVLMT*/ else if ((strcmp(szAction,"Env1")==0) || (strcmp(szAction,"SetTextureAsEnvironnement")==0)) { GLI_vSetMaterialAsChromed ( hVisualMat, 1); } else if (strcmp(szAction,"Backface")==0) { long lType; GLI_xGetMaterialType (hVisualMat,&lType); if (strcmp(szParams[0],"OFF") != 0) lType &= 0xffffffff - GLI_C_lIsTestingBackface; else lType |= GLI_C_lIsTestingBackface; GLI_xSetMaterialType (hVisualMat,lType); } break; } return SCR_ERV_Anl_NormalReturn; } /********************************************************************* *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadFaceMapDescriptor(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { ACP_tdxHandleOfFMD hFMD; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: GEO_xCreateFaceMapDescriptor(&hFMD); SCR_M_RdL0_SetSectionLong(0,0,(long)hFMD); SCR_M_RdL0_SetContextLong(0,0,(long)hFMD); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfFaceMapDescriptor(), a255_cLongName, (unsigned long)hFMD), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); break; case SCR_EA_Anl_Entry: /* Recuperation du materiau a remplir*/ SCR_M_RdL0_GetContextLong(0,0,ACP_tdxHandleOfFMD,hFMD); if (strcmp(szAction,"TripledUV")==0) { ACP_tdst2DUVValues stUV1,stUV2,stUV3; stUV1.xU = (float)atof(szParams[0]); stUV1.xV = (float)atof(szParams[1]); stUV2.xU = (float)atof(szParams[2]); stUV2.xV = (float)atof(szParams[3]); stUV3.xU = (float)atof(szParams[4]); stUV3.xV = (float)atof(szParams[5]); GEO_xSetFaceMapDescriptorUV(hFMD, &stUV1, &stUV2, &stUV3); } else if (strcmp(szAction,"GetTripledUV")==0) { ACP_tdst2DUVValues stUV1,stUV2,stUV3; ACP_tdxHandleOfFMD hTemp; SCR_tdst_Cxt_Values *p_stVal; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); hTemp = (ACP_tdxHandleOfFMD)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(hTemp != NULL); GEO_xGetFaceMapDescriptorUV(hTemp, &stUV1, &stUV2, &stUV3); GEO_xSetFaceMapDescriptorUV(hFMD, &stUV1, &stUV2, &stUV3); } else if( strcmp(szAction,"Material") == 0 ) { char sFile[256], sAction[256], sIdent[256]; GMT_tdxHandleToGameMaterial hMaterial; SCR_tdst_Cxt_Values *p_stVal; SCR_fn_v_RdL0_SplitSectionName(szParams[0], sFile, sAction, sIdent); if(strcmp(sAction,"Material") == 0) { ACP_tdxHandleOfMaterial hMat; GMT_tdxHandleToGameMaterial hGameMat; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); hMat = (ACP_tdxHandleOfMaterial)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); hGameMat = GMT_fn_hCreateGameMaterial(); GMT_fn_vSetVisualMaterial(hGameMat, hMat); hMaterial = hGameMat; } else hMaterial = GMT_fn_hLoadGameMaterial(szParams[0]); assert(hMaterial != NULL); GEO_xSetFaceMapDescriptorGameMaterial(hFMD, hMaterial); } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadSprite(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { ACP_tdxHandleOfSprite hSprite; MTH2D_tdstVector stSize; ACP_tdxIndex NbSprites; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: NbSprites=atoi(szParams[0]); GEO_vCreateRotativSprite(&hSprite, NbSprites); SCR_M_RdL0_SetSectionLong(0,0,(long)hSprite); SCR_M_RdL0_SetContextLong(0,0,(long)hSprite); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfSprite(), a255_cLongName, (unsigned long)hSprite), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); break; case SCR_EA_Anl_Entry: /* Recuperation du handle a remplir*/ SCR_M_RdL0_GetContextLong(0,0,ACP_tdxHandleOfSprite, hSprite); if (strcmp(szAction,"AddMaterial")==0) { char sFile[256], sAction[256], sIdent[256]; GMT_tdxHandleToGameMaterial hMaterial; ACP_tdxIndex xIndex; SCR_tdst_Cxt_Values *p_stVal; xIndex = atoi(szParams[0]); SCR_fn_v_RdL0_SplitSectionName(szParams[1], sFile, sAction, sIdent); if(strcmp(sAction,"Material") == 0) { ACP_tdxHandleOfMaterial hMat; GMT_tdxHandleToGameMaterial hGameMat; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[1], SCR_CDF_uw_Anl_Normal); hMat = (ACP_tdxHandleOfMaterial)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); hGameMat = GMT_fn_hCreateGameMaterial(); GMT_fn_vSetVisualMaterial(hGameMat, hMat); hMaterial = hGameMat; } else hMaterial = GMT_fn_hLoadGameMaterial(szParams[1]); assert(hMaterial != NULL); GEO_vSetGameMaterialOfSprite(hSprite, hMaterial, xIndex); } else if( strcmp(szAction,"AddInfo")==0) { ACP_tdxIndex xIndex; MTH_tdxReal xParam; BOOL b2DScaled; xIndex = atoi(szParams[0]); if( strcmp(szParams[1],"2DScaled")==0) { GEO_vSetModeOfSprite(hSprite, GEO_C_lSpriteDrawMode2DScaled , xIndex);/*Philippe*/ b2DScaled = TRUE; } else if( strcmp(szParams[1],"2DNonScaled")==0) { GEO_vSetModeOfSprite(hSprite, 0, xIndex); /* Marc V*/ b2DScaled = FALSE; } else if ( strcmp(szParams[1],"SemiLookAt")==0 ) { GEO_vSetModeOfSprite(hSprite, GEO_C_lSpriteDrawModeSemiLookAt , xIndex); b2DScaled = TRUE; } else if ( strcmp(szParams[1],"LensFlare")==0 ) { GEO_vSetModeOfSprite(hSprite, GEO_C_lSpriteDrawModeLensFlare, xIndex); b2DScaled = TRUE; } xParam = MTH_M_xDoubleToReal(atof(szParams[2])); GEO_vSetThresholdOfSprite(hSprite, xParam, xIndex); if(b2DScaled) { stSize.xX = MTH_M_xDoubleToReal(atof(szParams[3])*GLI_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName) / 2.0); stSize.xY = MTH_M_xDoubleToReal(atof(szParams[4])*GLI_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName) / 2.0); } else { stSize.xX = MTH_M_xDoubleToReal(atof(szParams[3]) / 2.0); stSize.xY = MTH_M_xDoubleToReal(atof(szParams[4]) / 2.0); } GEO_vSetSizeOfSprite(hSprite, &stSize, xIndex); stSize.xX = MTH_M_xDoubleToReal(atof(szParams[5])); stSize.xY = MTH_M_xDoubleToReal(atof(szParams[6])); GEO_vSetDisplacementOfSprite(hSprite, &stSize, xIndex); } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** ROLE : Load a texture *********************************************************************/ GLI_tdstTexture gst_Texture; SCR_tde_Anl_ReturnValue GLI_xLoadTextureSection(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { switch (cType) { case SCR_EA_Anl_BeginSection: break; case SCR_EA_Anl_Entry: if (strcmp(szAction,"Chromakey")==0) { if (strcmp(szParams[0],"DISABLE") == 0) { TEX_vSetTextureChromakey ( &gst_Texture, 0 , 0, 0, 0, 0, 0); } else { long lFiltre; unsigned char r,g,b,a; lFiltre = (strcmp(szParams[1],"FILTERING_ON") == 0) ? 1 : 0; r = (unsigned char)(atol(szParams[2]) & 0xff); g = (unsigned char)(atol(szParams[3]) & 0xff); b = (unsigned char)(atol(szParams[4]) & 0xff); a = (unsigned char)(atol(szParams[5]) & 0xff); TEX_vSetTextureChromakey( &gst_Texture, 1, lFiltre, r, g, b, a ); } } else if (strcmp(szAction,"Quality")==0) { char lQuality; if ( strcmp(szParams[0],"LOW") == 0) lQuality = TEX_C_QLOW; else if (strcmp(szParams[0],"HIGH") == 0) lQuality = (char)TEX_C_QHIGH; else lQuality = (char)TEX_C_QNORMAL; TEX_vSetTextureQualityLevel( &gst_Texture, lQuality ) ; } else if (strcmp(szAction,"Tiling")==0) { TEX_vSetTextureTilingMode( &gst_Texture, strcmp(szParams[0],"ON") == 0 , strcmp(szParams[1],"ON") == 0 ); } else if (strcmp(szAction,"MipMapping")==0) { gst_Texture.lNumberOfLod = (strcmp(szParams[0],"OFF") != 0) ? 1 : 0; } else if (strcmp(szAction,"LoadTexture")==0) { strcpy( gst_Texture.a255_cFileName, szParams[0] ); } else if (strcmp(szAction,"Bilinear")==0) { TEX_vSetTextureBilinearMode( &gst_Texture, strcmp(szParams[0],"ON") == 0 , strcmp(szParams[1],"ON") == 0 ); } else if (strcmp(szAction,"ZWrite")==0) { TEX_vSetTextureZWriteMode( &gst_Texture , strcmp(szParams[0],"OFF")); } /* * entries for PROCEDURAL_TEXTURE */ else if (strcmp(szAction, "Procedural") == 0) { TEXPRO_fnl_InitProceduralTextureWithName( &gst_Texture, szParams[0], atoi( szParams[1] ), atoi( szParams[2] ), atoi( szParams[3] ) ); } break; case SCR_EA_Anl_EndSection: { char a_cFullName[255]; GLI_tdstTexture *hTexture = NULL; char a255_cLongName[255]; SCR_tdst_Link_Value *pst_LinkValue; GLI_bGetTextureName(gst_Texture.a255_cFileName, a_cFullName); #ifdef EXGEOM_APPLI { char szRealName[ _MAX_PATH ]; extern long EXGEOM_TEX_fnl_FindTexture( char *, char *); if (EXGEOM_TEX_fnl_FindTexture( gst_Texture.a255_cFileName, szRealName ) ) GLI_xLoadTexture( &hTexture,NULL,szRealName,0,0); else GLI_xLoadTexture( &hTexture,NULL,gst_Texture.a255_cFileName,0,0); } #else GLI_xLoadTexture( &hTexture,NULL,gst_Texture.a255_cFileName,0,0); #endif SCR_M_RdL0_ComputeOpenSectionNameR ( 0 , a255_cLongName ) ; pst_LinkValue = SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfTextureSection(), a255_cLongName, (unsigned long)hTexture); SCR_M_v_Link_SetAdditionalLong( pst_LinkValue, 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0) ) ); pst_LinkValue = SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfTexture(), a_cFullName, (unsigned long)hTexture); SCR_M_v_Link_SetAdditionalLong( pst_LinkValue, 1, strlen(a_cFullName) - strlen(gst_Texture.a255_cFileName) ); SCR_M_RdL0_SetSectionLong(0,0,(long)hTexture); SCR_M_RdL0_SetContextLong(0,0,(long)hTexture); /* * set parameters given by section entry */ if (hTexture) { BOOL bOn, bFilter; BOOL bTilingU, bTilingV; unsigned char r,g,b,a; if (gst_Texture.lNumberOfLod) GLI_vComputeLod( hTexture ); TEX_vSetTextureQualityLevel(hTexture, TEX_ucGetTextureQualityLevel( &gst_Texture ) ); TEX_vGetTextureChromakey( &gst_Texture, &bOn ,&bFilter, &r, &g, &b, &a ); TEX_vSetTextureChromakey( hTexture, bOn, bFilter, r, g, b, a ); TEX_vSetTextureCyclingMode( hTexture, (unsigned char) (TEX_ucGetTextureCyclingMode( hTexture ) | TEX_ucGetTextureCyclingMode(&gst_Texture)) ); // restore tilling from parameters TEX_vGetTextureTilingMode(&gst_Texture, &bTilingU, &bTilingV); TEX_vSetTextureTilingMode(hTexture, bTilingU, bTilingV); } } break; } return SCR_ERV_Anl_NormalReturn; } /******************************************************************** ROLE : Load an Object *********************************************************************/ SCR_tde_Anl_ReturnValue GLI_xLoadGeometric(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { ACP_tdxHandleOfObject hObject; ACP_tdxIndex xIndex; char a255_cLongName[255]; switch (cType) { case SCR_EA_Anl_BeginSection: GEO_vCreateGeometricObject(&hObject, (ACP_tdxIndex)atoi(szParams[0]), (ACP_tdxIndex)atoi(szParams[2])); SCR_M_RdL0_SetSectionLong(0,0,(long)hObject); SCR_M_RdL0_SetContextLong(0,0,(long)hObject); SCR_M_RdL0_ComputeOpenSectionNameR(0, a255_cLongName); SCR_M_v_Link_SetAdditionalLong ( SCR_fnp_st_Link_SetValue(GLI_p_stGetLinkTableOfGeometric(), a255_cLongName, (unsigned long)hObject), 1, strlen(a255_cLongName) - strlen(SCR_M_RdL0_GetCompleteSectionNameR(0)) ); hObject->xNbEdges=atoi(szParams[1]); // FBF N64-format pour coords, et logfile dans x:\exe\geodump.log{ #ifdef U64CONVERTETLOG if (g_bLoadMap) { fprintf (dump,"===================================================================\n"); fprintf (dump,"%s\n",a255_cLongName); fflush(dump); } #endif //U64CONVERTLOG // } fin N64-format break; case SCR_EA_Anl_Entry: /* Recuperation du LoadGeometric a remplir*/ SCR_M_RdL0_GetContextLong(0,0,ACP_tdxHandleOfObject, hObject); /* Loading of object's vertex*/ if (strcmp(szAction,"AddVertex")==0) { MTH3D_tdstVector stPoint; xIndex = (ACP_tdxIndex)atoi(szParams[0]); MTH3D_M_vSetVectorElements ( &stPoint, MTH_M_xDoubleToReal(atof(szParams[1]) * GLI_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName)), MTH_M_xDoubleToReal(atof(szParams[2]) * GLI_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName)), MTH_M_xDoubleToReal(atof(szParams[3]) * GLI_dGetUnitInMeterInFile(p_fFile->a_szOpenFileName)) ); // FBF N64-format pour coords, et logfile dans x:\exe\geodump.log{ #ifdef U64CONVERTETLOG if (g_bLoadMap) { // round u64 stPoint.xX = (float) (( (long)( (stPoint.xX*fScale) + 0.5) ) / fScale); stPoint.xY = (float) (( (long)( (stPoint.xY*fScale) + 0.5) ) / fScale); stPoint.xZ = (float) (( (long)( (stPoint.xZ*fScale) + 0.5) ) / fScale); fprintf (dump,"point %03d : x=%f,y=%f,z=%f\n",xIndex,stPoint.xX,stPoint.xY,stPoint.xZ); fflush(dump); } #endif //U64CONVERTLOG // } fin N64-format GEO_vSetPointOfObject(hObject, &stPoint, xIndex); MTH3D_M_vSetVectorElements ( &stPoint, MTH_M_xDoubleToReal(atof(szParams[4])), MTH_M_xDoubleToReal(atof(szParams[5])), MTH_M_xDoubleToReal(atof(szParams[6])) ); // FBF N64-format pour coords, et logfile dans x:\exe\geodump.log{ #ifdef U64CONVERTETLOG if (g_bLoadMap) { // round u64 stPoint.xX = (float) (( (long)( (stPoint.xX*fScale) + 0.5) ) / fScale); stPoint.xY = (float) (( (long)( (stPoint.xY*fScale) + 0.5) ) / fScale); stPoint.xZ = (float) (( (long)( (stPoint.xZ*fScale) + 0.5) ) / fScale); fprintf (dump,"point normal %03d : x=%f,y=%f,z=%f\n",xIndex,stPoint.xX,stPoint.xY,stPoint.xZ); fflush(dump); } #endif //U64CONVERTLOG // } fin N64-format GEO_vSetNormalOfPointOfObject(hObject, &stPoint, xIndex); } else if (strcmp(szAction,"GetVertices")==0) { GEO_tdstGeometricObject *p_stTemp; SCR_tdst_Cxt_Values *p_stVal; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); p_stTemp = (GEO_tdstGeometricObject*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(p_stTemp != NULL); GEO_M_CPAFree(hObject->d_stListOfPoints); GEO_M_CPAFree(hObject->d_stListOfPointsNormals); hObject->d_stListOfPoints = p_stTemp->d_stListOfPoints; hObject->d_stListOfPointsNormals = p_stTemp->d_stListOfPointsNormals; } /* Loading of object's edge*/ else if (strcmp(szAction,"AddEdge")==0) { xIndex = (ACP_tdxIndex)atoi(szParams[0]); hObject->d_stListOfEdges[xIndex].a2_xIndex[0] = (ACP_tdxIndex)(atoi(szParams[1])); hObject->d_stListOfEdges[xIndex].a2_xIndex[1] = (ACP_tdxIndex)(atoi(szParams[2])); } else if (strcmp(szAction,"GetEdges")==0) { GEO_tdstGeometricObject *p_stTemp; SCR_tdst_Cxt_Values *p_stVal; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[0], SCR_CDF_uw_Anl_Normal); p_stTemp = (GEO_tdstGeometricObject*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(p_stTemp != NULL); GEO_M_CPAFree(hObject->d_stListOfEdges); hObject->d_stListOfEdges = p_stTemp->d_stListOfEdges; } /* Loading of object's element*/ else if (strcmp(szAction,"AddElement")==0) { char sFile[256], sAction[256], sIdent[256]; SCR_tdst_Cxt_Values *p_stVal; unsigned short uwTypeElement; void *p_stElement; xIndex = atoi(szParams[0]); SCR_fn_v_RdL0_SplitSectionName(szParams[2], sFile, sAction, sIdent); if(strcmp(sAction,"ElementIndexedTriangles")==0) uwTypeElement = GEO_C_xElementIndexedTriangles; else if(strcmp(sAction,"ElementSprites")==0) uwTypeElement = GEO_C_xElementSprites; else if(strcmp(sAction,"ElementFaceMapDescriptors")==0) uwTypeElement = GEO_C_xElementFaceMapDescriptors; else if(strcmp(sAction,"ElementTMeshes")==0) uwTypeElement = GEO_C_xElementTMeshes; else if(strcmp(sAction,"ElementSpheres")==0) uwTypeElement = GEO_C_xElementSpheres; else if(strcmp(sAction,"ElementAlignedBoxes")==0) uwTypeElement = GEO_C_xElementAlignedBoxes; else if(strcmp(sAction,"ElementPoints")==0) uwTypeElement = GEO_C_xElementPoints; else if(strcmp(sAction,"ElementLines")==0) uwTypeElement = GEO_C_xElementLines; else if(strcmp(sAction,"ElementCones")==0) uwTypeElement = GEO_C_xElementCones; /* Lecture du graphique*/ 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); assert(p_stElement != NULL); hObject->d_xListOfElementsTypes[xIndex] = uwTypeElement; hObject->d_stListOfElements[xIndex] = p_stElement; /* element bounding volume*/ if( (SCR_fn_uc_RdL0_GetNumberOfParameters(szParams)==4) && (hObject->xNbElements>1) ) { ACP_tdxIndex xBoundingVolume = (ACP_tdxIndex)atoi(szParams[3]); if( (xBoundingVolume>=0) && (xBoundingVolumexNbElements) ) { GEO_vSetParallelBoxIndexOfElement(hObject,xIndex,xBoundingVolume); if( xBoundingVolume+1 > hObject->xNbParallelBoxes ) hObject->xNbParallelBoxes = xBoundingVolume+1; } } } else if (strcmp(szAction,"GetElement")==0) { GEO_tdstGeometricObject *p_stTemp; long xIndexElement; SCR_tdst_Cxt_Values *p_stVal; xIndex = atoi(szParams[0]); xIndexElement = atoi(szParams[2]); p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szParams[1], SCR_CDF_uw_Anl_Normal); p_stTemp = (GEO_tdstGeometricObject*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); assert(p_stTemp != NULL); hObject->d_xListOfElementsTypes[xIndex] = p_stTemp->d_xListOfElementsTypes[xIndexElement]; hObject->d_stListOfElements[xIndex] = p_stTemp->d_stListOfElements[xIndexElement]; if( SCR_fn_uc_RdL0_GetNumberOfParameters(szParams) == 4 ) { ACP_tdxIndex xBoundingVolume = (ACP_tdxIndex)atoi(szParams[3]); if ( xBoundingVolume < 0 ) xBoundingVolume = 0; else if ( xBoundingVolume > hObject->xNbElements ) xBoundingVolume = hObject->xNbElements; GEO_vSetParallelBoxIndexOfElement(hObject,xIndex,xBoundingVolume); if( xBoundingVolume+1 > hObject->xNbParallelBoxes ) hObject->xNbParallelBoxes = xBoundingVolume+1; } } else if ( strcmp (szAction, "LookAt") == 0 ) { if ( stricmp (szParams[0], "TRUE") ) hObject->ulType = GEO_C_LookAt ; else hObject->ulType = GEO_C_SemiLookAt ; } break; case SCR_EA_Anl_EndSection: SCR_M_RdL0_GetContextLong(0,0,ACP_tdxHandleOfObject, hObject); /* ANNECY AV {*/ /* If faudra faire la modif après l'ECTS*/ /* GEO_vEndModifyObjectWithoutComputingNormal(hObject);*/ GEO_vEndModifyObject (hObject); /* END ANNECY AV }*/ break; } return SCR_ERV_Anl_NormalReturn; } SCR_tde_Anl_ReturnValue GLI_xLoadModCallback(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { GLI_tdstGeometricInfo *p_xGeometricInFile; ACP_tdxIndex xNbGeometric; switch (cType) { case SCR_EA_Anl_BeginSection: p_xGeometricInFile = (GLI_tdstGeometricInfo*)malloc(sizeof(GLI_tdstGeometricInfo)); 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],"Geometric")==0) { ACP_tdxHandleOfObject hGeometric; SCR_M_RdL0_GetContextLong(0,0,GLI_tdstGeometricInfo*,p_xGeometricInFile); SCR_M_RdL0_GetContextLong(0,1,ACP_tdxIndex,xNbGeometric); p_xGeometricInFile = (GLI_tdstGeometricInfo*)realloc(p_xGeometricInFile,++xNbGeometric*sizeof(GLI_tdstGeometricInfo)); SCR_M_RdL0_GetSectionLong(1,0,ACP_tdxHandleOfObject,hGeometric); strcpy(p_xGeometricInFile[xNbGeometric-1].a_cFileName,p_fFile->a_szOpenFileName); strcpy(p_xGeometricInFile[xNbGeometric-1].a_cSectionName,szParams[2]); p_xGeometricInFile[xNbGeometric-1].hObject=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,GLI_tdstGeometricInfo*,p_xGeometricInFile); SCR_M_RdL0_GetContextLong(0,1,ACP_tdxIndex,xNbGeometric); SCR_M_RdL0_SetSectionLong(0,0,(long)p_xGeometricInFile); SCR_M_RdL0_SetSectionLong(0,1,(long)xNbGeometric); break; } return SCR_ERV_Anl_NormalReturn; } /* Get File version*/ double GLI_dGetFileVersion(char *szGeometricFile) { double ret; SCR_M_RdL0_GetFileDouble(0, 0, ret); return ret; } /* Get Unite In Meter*/ double GLI_dGetUnitInMeterInFile(char *szGeometricFile) { double ret; SCR_M_RdL0_GetFileDouble(0, 1, ret); return ret; } /******************************************************************************** NOM : GLI_pLoadGeometricInFile ROLE : Find an Object in szGeometricFile with szGeometricName and return p_stGeometric *********************************************************************************/ ACP_tdxHandleOfObject GEO_fn_hLoadGeometricObject(char* _szSectionName, unsigned short _uwScriptMode); ACP_tdxHandleOfObject GLI_pLoadGeometricInFile(char *szGeometricName) { ACP_tdxHandleOfObject hGeoObj; hGeoObj=GEO_fn_hLoadGeometricObject(szGeometricName,SCR_CDF_uw_Anl_Normal); return hGeoObj; } /*===============================================================================*/ /* FONCTIONS UTILISEES POUR LE CHARGEMENT D'UN FICHIER ENTIER */ /*===============================================================================*/ void GLI_vInitLoad() { /* Init des scripts et lecture du fichier*/ SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionTexture, GLI_xLoadTextureSection , SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionGeometric, GLI_xLoadGeometric, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionPhysical, GLI_xLoadGeometric, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionSpecialEffect, GLI_xLoadGeometric, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionElementIndexedTriangles, GLI_xLoadElementIndexedTriangles, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionElementFaceMapDescriptors, GLI_xLoadElementFaceMapDescriptors, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionElementSprites, GLI_xLoadElementSprites, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionElementTMeshes, GLI_xLoadElementTMeshes, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionElementLines, GLI_xLoadElementLines, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionElementSpheres, GLI_xLoadElementSpheres, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionElementAlignedBoxes, GLI_xLoadElementAlignedBoxes, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionElementPoints, GLI_xLoadElementPoints, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionElementCones, GLI_xLoadElementCones, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionVisualMaterial, GLI_xLoadMaterial, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionFaceMapDescriptor, GLI_xLoadFaceMapDescriptor, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(GLI_C_SectionSprite, GLI_xLoadSprite, SCR_CRC_c_RdL0_ForSection); SCR_fn_v_RdL0_RegisterCallback(".mod", GLI_xLoadModCallback, SCR_CRC_c_RdL0_ForFile); sprintf(szTexturePath,"."); GLI_vInitLinkTableOfGeometric(); } /******************************************************************** NOM : GLI_vLoadMODFile ROLE : Load an entire MOD File and return a tab of object's index in lib *********************************************************************/ void GLI_vLoadMODFile(char *szPathName, char *szFileName, GLI_tdstGeometricInfo **h_xGeometricInFile, ACP_tdxIndex *p_xNbGeometric) { SCR_tdst_Cxt_Values *p_stVal; SCR_fn_v_RdL0_RegisterPath(szPathName); p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal); *h_xGeometricInFile = (GLI_tdstGeometricInfo *)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); *p_xNbGeometric = (ACP_tdxIndex)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,1); } #ifdef __cplusplus } /*extern "C"*/ #endif