/*========================================================================= * * Material.c - Material functions * * Version 1.0 * Revision date * *=======================================================================*/ #include "Material.h" #include #include "conventi.h" #include "print.h" #include "system.h" #include "Textures.h" #include "SaveModifLst.h" //--- Defines --------------------------------------------------------------- #define MLT_C_lNoCycling 0 #define MLT_C_lCyclingU 1 #define MLT_C_lCyclingV 2 #define MLT_C_lCyclingUV 3 //-------------------------------------------------------------------- /**************************************************************************** * Description: load a game material * * Parameters: p_stFile : script file pointer * szAction : section or entry name * szParams : parameters * cType : action type *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ SCR_tde_Anl_ReturnValue MLT_xLoadGameMaterial(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { MLT_tdstGameMaterial *p_hMaterial; xString sFile, sAction, sIdent, sIdent2; switch (cType) { case SCR_EA_Anl_BeginSection: p_hMaterial = (MLT_tdstGameMaterial*)malloc(sizeof(MLT_tdstGameMaterial)); SCR_M_RdL0_SetSectionLong(0,0,(long)p_hMaterial); SCR_M_RdL0_SetContextLong(0,0,(long)p_hMaterial); SCR_fn_v_RdL0_SplitSectionName(SCR_M_RdL0_GetCompleteSectionNameR(0), sFile, sAction, sIdent); sprintf(sFile, "%s.gmt", g_sFileIn); SCR_fn_v_RdL0_ComputeSectionName(p_hMaterial->sName, sFile, sAction, sIdent); strcpy(p_hMaterial->sNameCMT, ""); p_hMaterial->bMaxMaterial = TRUE; p_hMaterial->lSoundType = -1; break; case SCR_EA_Anl_Entry: SCR_M_RdL0_GetContextLong(0,0,MLT_tdstGameMaterial*,p_hMaterial); // Loading Line if (strcmp(szAction,M_GMTActionVisualMat)==0) { strcpy(sIdent, szParams[0]); SCR_fn_v_RdL0_SplitSectionName(sIdent, sFile, sAction, sIdent2); SCR_fn_v_RdL0_ComputeSectionName(p_hMaterial->sName, sFile, sAction, sIdent2+4); } if (strcmp(szAction,M_GMTActionCollideMat)==0) { strcpy(sIdent, szParams[0]); SCR_fn_v_RdL0_SplitSectionName(sIdent, sFile, sAction, sIdent2); strcpy( p_hMaterial->sNameCMT, sIdent2); p_hMaterial->bMaxMaterial = FALSE; } if (strcmp(szAction,M_GMTActionSoundMat)==0) { p_hMaterial->lSoundType = atoi(szParams[0]); } break; case SCR_EA_Anl_EndSection: break; } return SCR_ERV_Anl_NormalReturn; } /**************************************************************************** * Description: load a material * * Parameters: p_stFile : script file pointer * szAction : section or entry name * szParams : parameters * cType : action type *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ SCR_tde_Anl_ReturnValue MLT_xLoadMaterial(SCR_tdst_File_Description *p_fFile, char *szAction, char *szParams[], SCR_tde_Anl_Action cType) { MLT_tdstMaterial *p_hMaterial; xString sFile, sAction, sIdent; switch (cType) { case SCR_EA_Anl_BeginSection: p_hMaterial = (MLT_tdstMaterial*)malloc(sizeof(MLT_tdstMaterial)); SCR_M_RdL0_SetSectionLong(0,0,(long)p_hMaterial); SCR_M_RdL0_SetContextLong(0,0,(long)p_hMaterial); SCR_fn_v_RdL0_SplitSectionName(SCR_M_RdL0_GetCompleteSectionNameR(0), sFile, sAction, sIdent); sprintf(sFile, "%s.vmt", g_sFileIn); SCR_fn_v_RdL0_ComputeSectionName(p_hMaterial->sName, sFile, sAction, sIdent); memset(p_hMaterial->sTexture, 0, 100*sizeof(xString)); memset(p_hMaterial->fTexture1, 0, 100*sizeof(float)); sprintf(p_hMaterial->sMaterialType, "Flat"); p_hMaterial->stAmbient.xR = 0.0f; p_hMaterial->stAmbient.xG = 0.0f; p_hMaterial->stAmbient.xB = 0.0f; p_hMaterial->stDiffuse.xR = 0.0f; p_hMaterial->stDiffuse.xG = 0.0f; p_hMaterial->stDiffuse.xB = 0.0f; p_hMaterial->stSpecular.xR = 0.0f; p_hMaterial->stSpecular.xG = 0.0f; p_hMaterial->stSpecular.xB = 0.0f; p_hMaterial->lSpecularExponent = 0; p_hMaterial->bAlreadySave = FALSE; p_hMaterial->lTexture = 0; p_hMaterial->lNbScroll = 0; p_hMaterial->bExistAmbient = FALSE; p_hMaterial->bExistDiffuse = FALSE; strcpy(p_hMaterial->sBackface, ""); strcpy(p_hMaterial->sNameCMT, ""); p_hMaterial->bMaxMaterial = TRUE; strcpy(p_hMaterial->sMipMapping, "ON"); strcpy(p_hMaterial->sTilingFirst, ""); strcpy(p_hMaterial->sTilingSecond, ""); // multitextures p_hMaterial->lMultiTexture = 0; p_hMaterial->lUVComputing = 0; break; case SCR_EA_Anl_Entry: SCR_M_RdL0_GetContextLong(0,0,MLT_tdstMaterial*,p_hMaterial); // Loading Line if (strcmp(szAction,M_VMTActionType)==0) { sprintf(p_hMaterial->sMaterialType, "%s", szParams[0]); } if (strcmp(szAction,M_VMTActionAmbientColor)==0) { p_hMaterial->stAmbient.xR = (float)atof(szParams[0]); p_hMaterial->stAmbient.xG = (float)atof(szParams[1]); p_hMaterial->stAmbient.xB = (float)atof(szParams[2]); if (szParams[3]) { p_hMaterial->stAmbient.xA = (float)atof(szParams[3]); p_hMaterial->bExistAmbient = TRUE; } } if (strcmp(szAction,M_VMTActionBackface)==0) { sprintf(p_hMaterial->sBackface, "%s", szParams[0]); } if (strcmp(szAction,M_VMTActionDiffuseColor)==0) { p_hMaterial->stDiffuse.xR = (float)atof(szParams[0]); p_hMaterial->stDiffuse.xG = (float)atof(szParams[1]); p_hMaterial->stDiffuse.xB = (float)atof(szParams[2]); if (szParams[3]) { p_hMaterial->stDiffuse.xA = (float)atof(szParams[3]); p_hMaterial->bExistDiffuse = TRUE; } } if (strcmp(szAction,M_VMTActionSpecularColor)==0) { p_hMaterial->stSpecular.xR = (float)atof(szParams[0]); p_hMaterial->stSpecular.xG = (float)atof(szParams[1]); p_hMaterial->stSpecular.xB = (float)atof(szParams[2]); p_hMaterial->lSpecularExponent = (long)atoi(szParams[3]); } if (strcmp(szAction,M_VMTActionScroll)==0) { p_hMaterial->fScroll1[(long)atoi(szParams[0])] = (float)atof(szParams[1]); p_hMaterial->fScroll2[(long)atoi(szParams[0])] = (float)atof(szParams[2]); p_hMaterial->lNbScroll = (p_hMaterial->lNbScroll>(long)atoi(szParams[0])?p_hMaterial->lNbScroll+1:(long)atoi(szParams[0])+1); } // multitextures if (strcmp(szAction,M_VMTActionMultiTexture)==0) { xString sFile, sAction, sIdent; SCR_tdst_Cxt_Values *p_stVal; char *sTexture; int i; strcpy(p_hMaterial->stMultiTexture[p_hMaterial->lMultiTexture].sName, szParams[1]); SCR_fn_v_RdL0_SplitSectionName(szParams[2], sFile, sAction, sIdent); if (!strstr(sFile, ".tex")) sprintf(sFile, "%s.mod", g_sFileIn); strcpy(p_hMaterial->stMultiTexture[p_hMaterial->lMultiTexture].sLinarMipMapping, "ON"); strcpy(p_hMaterial->stMultiTexture[p_hMaterial->lMultiTexture].sPerspectiveCorrection, "ON"); for (i=0; i<3; i++) p_hMaterial->stMultiTexture[p_hMaterial->lMultiTexture].fBlendToColor[i] = 0.0; p_hMaterial->stMultiTexture[p_hMaterial->lMultiTexture].fBlendToAlpha = 0.0; SCR_fn_v_RdL0_ComputeSectionName(sAction, MLT_p_cGetFileNameWithoutPath(sFile), M_Texture, sIdent); if(SCR_fn_c_RdL0_IsSectionExists(sAction)) { p_stVal = SCR_fnp_st_RdL0_AnalyseSection(sAction, SCR_CDF_uw_Anl_Normal); sTexture = (char *)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); } strcpy(p_hMaterial->stMultiTexture[p_hMaterial->lMultiTexture].sTexture, sIdent); strcpy(p_hMaterial->stMultiTexture[p_hMaterial->lMultiTexture].sLoad, sTexture); strcpy(p_hMaterial->stMultiTexture[p_hMaterial->lMultiTexture].sOption, szParams[3]); p_hMaterial->lMultiTexture++; } if (strcmp(szAction,M_VMTActionUVComputing)==0) { strcpy(p_hMaterial->stUVComputing[p_hMaterial->lUVComputing].sName, szParams[1]); strcpy(p_hMaterial->stUVComputing[p_hMaterial->lUVComputing].sObject, szParams[2]); p_hMaterial->stUVComputing[p_hMaterial->lUVComputing].iPosUSpeed = atoi(szParams[3]); p_hMaterial->stUVComputing[p_hMaterial->lUVComputing].iPosU = atoi(szParams[4]); p_hMaterial->stUVComputing[p_hMaterial->lUVComputing].iPosVSpeed = atoi(szParams[5]); p_hMaterial->stUVComputing[p_hMaterial->lUVComputing].iPosV = atoi(szParams[6]); p_hMaterial->stUVComputing[p_hMaterial->lUVComputing].iAngleSpeed = atoi(szParams[7]); p_hMaterial->stUVComputing[p_hMaterial->lUVComputing].iAngleAlpha = atoi(szParams[8]); p_hMaterial->stUVComputing[p_hMaterial->lUVComputing].iScaleU = atoi(szParams[9]); p_hMaterial->stUVComputing[p_hMaterial->lUVComputing].iScaleV = atoi(szParams[10]); p_hMaterial->lUVComputing++; } if (strcmp(szAction,M_VMTActionAddTexture)==0) { SCR_tdst_Cxt_Values *p_stVal; char *sTexture; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(MLT_p_cGetFileNameWithoutPath(szParams[1]), SCR_CDF_uw_Anl_Normal); sTexture = (char*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); strcpy(p_hMaterial->sTexture[p_hMaterial->lTexture], sTexture); if(szParams[2]) p_hMaterial->fTexture1[p_hMaterial->lTexture] = (float)atof(szParams[2]); p_hMaterial->lTexture++; } if (strcmp(szAction,M_Texture)==0) { xString sDir; char *sTemp; MLT_vCopyTexturesFromRaw(szParams[0], sDir); MLT_vCopyTextureIfFound(szParams[0], sDir); sTemp = strstr(sDir, "Textures\\"); if(sTemp == NULL) { sprintf(sDir, ""); } else { sprintf(sDir, "%s\\", sTemp+9); } sprintf(p_hMaterial->sTexture[p_hMaterial->lTexture], "%s%s", sDir, szParams[0]); p_hMaterial->lTexture++; } break; case SCR_EA_Anl_EndSection: break; } return SCR_ERV_Anl_NormalReturn; } /**************************************************************************** * Description: save GMT file * * Parameters: p_stFile : script file pointer * sFileName : file name * p_vPtr : data pointer * xAction : script action *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ void MLT_vSaveGmtFile(SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction) { xString sComment, sDate, sTime; SCR_M_SvL0_SaveScriptFileHeader(p_stFile); sprintf(sComment, ".GMT (Game Material) : %s", p_stFile->a_szFileName); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveBlankLine(p_stFile); sprintf(sComment, "Generated by Max23Dos Moulinette"); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveBlankLine(p_stFile); _strtime(sTime); _strdate(sDate); sprintf(sComment, "Created date : %s %s", sDate, sTime); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveBlankLine(p_stFile); sprintf(sComment, "Version directive, the version number is stored in file result 0"); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveDirective(p_stFile, M_SetCurrentFileDouble,SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%.2f", 0, 1.0); SCR_M_SvL0_SaveBlankLine(p_stFile); } /**************************************************************************** * Description: save VMT file * * Parameters: p_stFile : script file pointer * sFileName : file name * p_vPtr : data pointer * xAction : script action *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ void MLT_vSaveVmtFile(SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction) { xString sComment, sDate, sTime; SCR_M_SvL0_SaveScriptFileHeader(p_stFile); sprintf(sComment, ".VMT (Visual Material) : %s", p_stFile->a_szFileName); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveBlankLine(p_stFile); sprintf(sComment, "Generated by Max23Dos Moulinette"); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveBlankLine(p_stFile); _strtime(sTime); _strdate(sDate); sprintf(sComment, "Created date : %s %s", sDate, sTime); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveBlankLine(p_stFile); sprintf(sComment, "Version directive, the version number is stored in file result 0"); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveDirective(p_stFile, M_SetCurrentFileDouble,SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%.2f", 0, 1.0); SCR_M_SvL0_SaveBlankLine(p_stFile); } /**************************************************************************** * Description: save TEX file * * Parameters: p_stFile : script file pointer * sFileName : file name * p_vPtr : data pointer * xAction : script action *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ void MLT_vSaveTexFile(SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction) { xString sComment, sDate, sTime; SCR_M_SvL0_SaveScriptFileHeader(p_stFile); sprintf(sComment, ".TEX (Texture) : %s", p_stFile->a_szFileName); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveBlankLine(p_stFile); sprintf(sComment, "Generated by Max23Dos Moulinette"); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveBlankLine(p_stFile); _strtime(sTime); _strdate(sDate); sprintf(sComment, "Created date : %s %s", sDate, sTime); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveBlankLine(p_stFile); sprintf(sComment, "Version directive, the version number is stored in file result 0"); SCR_M_SvL0_SaveComment(p_stFile, sComment); SCR_M_SvL0_SaveDirective(p_stFile, M_SetCurrentFileDouble,SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%.2f", 0, 1.0); SCR_M_SvL0_SaveBlankLine(p_stFile); } /**************************************************************************** * Description: save game material * * Parameters: p_stFile : script file pointer * sFileName : file name * p_vPtr : data pointer * xAction : script action *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ void MLT_vSaveGameMaterial (SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction) { MLT_tdstGameMaterial *p_stGameMaterial; SCR_tdst_Cxt_Values *p_stVal; MLT_tdstMaterial *p_stMaterial; xString sSection, sFile, sAction, sIdent, sIdent2; p_stMaterial = (MLT_tdstMaterial *)p_vPtr; if(xAction == SCR_EA_Ntfy_AddSection) { SCR_fn_v_SvL1_ToEndSection(p_stFile); } else return; p_stMaterial->lSoundType = -1; if (!g_bIgnoreGmt) { SCR_fn_v_RdL0_SplitSectionName(p_stMaterial->sName, sFile, sAction, sIdent); sprintf(sFile, "%s.gmt", "temp"); SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_GameMaterial, sIdent); if(SCR_fn_c_RdL0_IsSectionExists(sSection)) { p_stVal = SCR_fnp_st_RdL0_AnalyseSection(sSection, SCR_CDF_uw_Anl_Normal); p_stGameMaterial = (MLT_tdstGameMaterial *)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); strcpy(p_stMaterial->sNameCMT, p_stGameMaterial->sNameCMT); p_stMaterial->bMaxMaterial = p_stGameMaterial->bMaxMaterial; p_stMaterial->lSoundType = p_stGameMaterial->lSoundType; } } SCR_fn_v_RdL0_SplitSectionName(p_stMaterial->sName, sFile, sAction, sIdent); sprintf(sFile, "Ed.gmt"); SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_GameMaterial, sIdent); SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(sSection), SCR_CC_C_Cfg_EOL); sprintf(sIdent2, "MAT_%s", sIdent); sprintf(sFile, "%s%s.vmt", g_sDirectorySave, g_sFileMaterial); SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_Material, sIdent2); SCR_M_SvL0_SaveEntry(p_stFile, M_GMTActionVisualMat, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, sSection); if (strcmp(p_stMaterial->sNameCMT, "")) { //if the name of the collide mat is not null, save an entry in the .gmt file SCR_M_SvL0_SaveEntry(p_stFile, M_GMTActionCollideMat, SCR_CC_C_Cfg_NoChar); strcpy(sSection, "ED.cmt^CollideMaterial:"); if (p_stMaterial->bMaxMaterial) strcat(sSection, "MAX_"); strcat(sSection, p_stMaterial->sNameCMT); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, sSection); } if (p_stMaterial->lSoundType != -1) { //if the name of the collide mat is not null, save an entry in the .gmt file SCR_M_SvL0_SaveEntry(p_stFile, M_GMTActionSoundMat, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d", p_stMaterial->lSoundType); } SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL); } /**************************************************************************** * Description: save visual material * * Parameters: p_stFile : script file pointer * sFileName : file name * p_vPtr : data pointer * xAction : script action *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ void MLT_vSaveVisualMaterial(SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction) { SCR_tdst_Cxt_Values *p_stVal; MLT_tdstMaterial *p_stMaterial; MLT_tdstMaterial *p_stOldMaterial=NULL; xString sFile, sAction, sIdent, sIdent2, sSection; long i, l; p_stMaterial = (MLT_tdstMaterial *)p_vPtr; SCR_fn_v_RdL0_SplitSectionName(p_stMaterial->sName, sFile, sAction, sIdent); sprintf(sFile, "%s", p_stFile->a_szOpenFileName); sprintf(sIdent2, "MAT_%s", sIdent); SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent2); if(xAction == SCR_EA_Ntfy_AddSection) { SCR_fn_v_SvL1_ToEndSection(p_stFile); } else { g_bPrintOutOK=FALSE; p_stVal = SCR_fnp_st_RdL0_AnalyseSection(sSection, SCR_CDF_uw_Anl_Normal); p_stOldMaterial = (MLT_tdstMaterial*)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); g_bPrintOutOK=TRUE; if (!g_bIgnoreTex) { p_stMaterial->lNbScroll = (p_stMaterial->lNbScroll>p_stOldMaterial->lNbScroll?p_stMaterial->lNbScroll:p_stOldMaterial->lNbScroll); for(i=0;ilNbScroll;i++) { p_stMaterial->fScroll1[i] = p_stOldMaterial->fScroll1[i]; p_stMaterial->fScroll2[i] = p_stOldMaterial->fScroll2[i]; } } p_stMaterial->lTexture = (p_stMaterial->lTexture>p_stOldMaterial->lTexture ? p_stMaterial->lTexture : p_stOldMaterial->lTexture); for(l=1;llTexture;l++) { strcpy(p_stMaterial->sTexture[l], p_stOldMaterial->sTexture[l]); } for(l=0;llTexture;l++) { p_stMaterial->fTexture1[l] = p_stOldMaterial->fTexture1[l]; } strcpy(p_stMaterial->sMaterialType, p_stOldMaterial->sMaterialType); if (!g_bIgnoreTex) { p_stMaterial->stAmbient = p_stOldMaterial->stAmbient; p_stMaterial->stDiffuse = p_stOldMaterial->stDiffuse; p_stMaterial->stSpecular = p_stOldMaterial->stSpecular; p_stMaterial->lSpecularExponent = p_stOldMaterial->lSpecularExponent; p_stMaterial->bExistDiffuse = p_stOldMaterial->bExistDiffuse; p_stMaterial->bExistAmbient = p_stOldMaterial->bExistAmbient; strcpy(p_stMaterial->sBackface, p_stOldMaterial->sBackface); // multitextures for (i=0; ilMultiTexture; i++) { strcpy(p_stMaterial->stMultiTexture[i].sName, p_stOldMaterial->stMultiTexture[i].sName); strcpy(p_stMaterial->stMultiTexture[i].sTexture, p_stOldMaterial->stMultiTexture[i].sTexture); strcpy(p_stMaterial->stMultiTexture[i].sOption, p_stOldMaterial->stMultiTexture[i].sOption); } for (i=0; ilUVComputing; i++) { strcpy(p_stMaterial->stUVComputing[i].sName, p_stOldMaterial->stUVComputing[i].sName); strcpy(p_stMaterial->stUVComputing[i].sObject, p_stOldMaterial->stUVComputing[i].sObject); p_stMaterial->stUVComputing[i].iPosUSpeed = p_stOldMaterial->stUVComputing[i].iPosUSpeed; p_stMaterial->stUVComputing[i].iPosU = p_stOldMaterial->stUVComputing[i].iPosU; p_stMaterial->stUVComputing[i].iPosVSpeed = p_stOldMaterial->stUVComputing[i].iPosVSpeed; p_stMaterial->stUVComputing[i].iPosV = p_stOldMaterial->stUVComputing[i].iPosV; p_stMaterial->stUVComputing[i].iAngleSpeed = p_stOldMaterial->stUVComputing[i].iAngleSpeed; p_stMaterial->stUVComputing[i].iAngleAlpha = p_stOldMaterial->stUVComputing[i].iAngleAlpha; p_stMaterial->stUVComputing[i].iScaleU = p_stOldMaterial->stUVComputing[i].iScaleU; p_stMaterial->stUVComputing[i].iScaleV = p_stOldMaterial->stUVComputing[i].iScaleV; } } SCR_fn_v_SvL1_DeleteSection(p_stFile); } SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(sSection), SCR_CC_C_Cfg_EOL); SCR_M_SvL0_SaveEntry(p_stFile, M_VMTActionType, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_stMaterial->sMaterialType); SCR_M_SvL0_SaveEntry(p_stFile, M_VMTActionAmbientColor, SCR_CC_C_Cfg_NoChar); if (p_stMaterial->bExistAmbient) SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%.6f,%.6f,%.6f,%.6f", p_stMaterial->stAmbient.xR, p_stMaterial->stAmbient.xG, p_stMaterial->stAmbient.xB, p_stMaterial->stAmbient.xA); else SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%.6f,%.6f,%.6f", p_stMaterial->stAmbient.xR, p_stMaterial->stAmbient.xG, p_stMaterial->stAmbient.xB); SCR_M_SvL0_SaveEntry(p_stFile, M_VMTActionDiffuseColor, SCR_CC_C_Cfg_NoChar); if (p_stMaterial->bExistDiffuse) SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%.6f,%.6f,%.6f,%.6f", p_stMaterial->stDiffuse.xR, p_stMaterial->stDiffuse.xG, p_stMaterial->stDiffuse.xB, p_stMaterial->stDiffuse.xA); else SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%.6f,%.6f,%.6f", p_stMaterial->stDiffuse.xR, p_stMaterial->stDiffuse.xG, p_stMaterial->stDiffuse.xB); SCR_M_SvL0_SaveEntry(p_stFile, M_VMTActionSpecularColor, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%.6f,%.6f,%.6f,%d", p_stMaterial->stSpecular.xR, p_stMaterial->stSpecular.xG, p_stMaterial->stSpecular.xB, p_stMaterial->lSpecularExponent); if (strcmp(p_stMaterial->sBackface, "")) { SCR_M_SvL0_SaveEntry(p_stFile, M_VMTActionBackface, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%s", p_stMaterial->sBackface); } for(i=0;ilTexture;i++) if(strlen(p_stMaterial->sTexture[i]) != 0) { sprintf(sFile, "%s%s.tex", g_sDirectorySave, g_sFileIn); sprintf(sIdent, "TEX_%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(p_stMaterial->sTexture[i])))); SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_Texture, sIdent); SCR_M_SvL0_SaveEntry(p_stFile, M_VMTActionAddTexture, SCR_CC_C_Cfg_NoChar); if(p_stMaterial->fTexture1[i]) SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%s,%f", i, sSection, p_stMaterial->fTexture1[i]); else SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%d,%s", i, sSection); } for(i=0;ilNbScroll;i++) { SCR_M_SvL0_SaveEntry(p_stFile, M_VMTActionScroll, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%d,%.6f,%.6f", i, p_stMaterial->fScroll1[i], p_stMaterial->fScroll2[i]); } // multitextures for(i=0;ilMultiTexture;i++) { sprintf(sFile, "%s%s.tex", g_sDirectorySave, g_sFileIn); sprintf(sIdent, "%s", p_stMaterial->stMultiTexture[i].sTexture); SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, M_Texture, sIdent); SCR_M_SvL0_SaveEntry(p_stFile, M_VMTActionMultiTexture, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 5, "%d,%s,%s,%s", i, p_stMaterial->stMultiTexture[i].sName, sSection, p_stMaterial->stMultiTexture[i].sOption); } for(i=0;ilUVComputing;i++) { SCR_M_SvL0_SaveEntry(p_stFile, M_VMTActionUVComputing, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 12, "%d,%s,%s,%d,%d,%d,%d,%d,%d,%d,%d", i, p_stMaterial->stUVComputing[i].sName, p_stMaterial->stUVComputing[i].sObject, p_stMaterial->stUVComputing[i].iPosUSpeed, p_stMaterial->stUVComputing[i].iPosU, p_stMaterial->stUVComputing[i].iPosVSpeed, p_stMaterial->stUVComputing[i].iPosV, p_stMaterial->stUVComputing[i].iAngleSpeed, p_stMaterial->stUVComputing[i].iAngleAlpha, p_stMaterial->stUVComputing[i].iScaleU, p_stMaterial->stUVComputing[i].iScaleV ); } SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL); } /**************************************************************************** * Description: save texture * * Parameters: p_stFile : script file pointer * sFileName : file name * p_vPtr : data pointer * xAction : script action *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ void MLT_vSaveTexture (SCR_tdst_File_Description *p_stFile, char *sFileName, void *p_vPtr, SCR_tde_Ntfy_Action xAction) { MLT_tdstMaterial *p_stMaterial; MLT_tdstMaterial *p_stOldMaterial=NULL; xString sFile, sAction, sIdent2, sSection; BOOL bChange=FALSE; BOOL bChangeTiling=FALSE; int i, l; p_stMaterial = (MLT_tdstMaterial *)p_vPtr; sprintf(sFile, "%s", p_stFile->a_szOpenFileName); sprintf(sAction, M_Texture); // multitextures if (!p_stMaterial->lMultiTexture) sprintf(sIdent2, "TEX_%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(p_stMaterial->sTexture[p_stMaterial->lCurTexture])))); else sprintf(sIdent2, "%s", MLT_p_cEraseSpace(MLT_p_cGetFileNameWithoutExt(MLT_p_cGetFileNameWithoutPath(p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].sTexture)))); SCR_fn_v_RdL0_ComputeSectionName(sSection, sFile, sAction, sIdent2); // init the material default parameters strcpy(p_stMaterial->sQuality[p_stMaterial->lCurTexture], "NORMAL"); strcpy(p_stMaterial->sMipMapping, "ON"); if(xAction == SCR_EA_Ntfy_AddSection) { SCR_fn_v_SvL1_ToEndSection(p_stFile); bChangeTiling = TRUE; } else { SCR_tdst_Cxt_Values *p_stVal; xString sName, sFile1, sAction1, sIdent1; SCR_fn_v_RdL0_SplitSectionName(p_stMaterial->sName, sFile1, sAction1, sIdent1); strcpy(sName, "MAT_"); strcat(sName, sIdent1); strcpy(sIdent1, sName); SCR_fn_v_RdL0_ComputeSectionName(sName, sFile1, sAction1, sIdent1); if(SCR_fn_c_RdL0_IsSectionExists(sName)) { p_stVal = SCR_fnp_st_RdL0_AnalyseSection(sName, SCR_CDF_uw_Anl_Normal); p_stOldMaterial = (MLT_tdstMaterial *)SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); strcpy(p_stMaterial->sMipMapping, p_stOldMaterial->sMipMapping); strcpy(p_stMaterial->sTilingFirst, p_stOldMaterial->sTilingFirst); strcpy(p_stMaterial->sTilingSecond, p_stOldMaterial->sTilingSecond); // multitextures if (!g_bIgnoreTex) { strcpy(p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].sLinarMipMapping, p_stOldMaterial->stMultiTexture[p_stMaterial->lCurTexture].sLinarMipMapping); strcpy(p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].sPerspectiveCorrection, p_stOldMaterial->stMultiTexture[p_stMaterial->lCurTexture].sPerspectiveCorrection); for (i=0; i<3; i++) p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].fBlendToColor[i] = p_stOldMaterial->stMultiTexture[p_stMaterial->lCurTexture].fBlendToColor[i]; p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].fBlendToAlpha = p_stOldMaterial->stMultiTexture[p_stMaterial->lCurTexture].fBlendToAlpha; } p_stMaterial->lTexture = (p_stMaterial->lTexture>p_stOldMaterial->lTexture ? p_stMaterial->lTexture : p_stOldMaterial->lTexture); for(l=0;llTexture;l++) { strcpy(p_stMaterial->sQuality[l], p_stOldMaterial->sQuality[l]); strcpy(p_stMaterial->sEnable[l], p_stOldMaterial->sEnable[l]); strcpy(p_stMaterial->sOn[l], p_stOldMaterial->sOn[l]); for (i=0; i<4; i++) { p_stMaterial->iVal[i][l]=p_stOldMaterial->iVal[i][l]; } bChange = TRUE; } } else bChangeTiling = TRUE; // multitextures if (!p_stMaterial->lMultiTexture) SCR_fn_v_SvL1_DeleteSection(p_stFile); else { //delete the section!!! if (!g_bIgnoreTex) return; SCR_fn_v_SvL1_DeleteSection(p_stFile); } } SCR_M_SvL0_SaveBeginSection(p_stFile, MLT_p_cGetSectionName(sSection), SCR_CC_C_Cfg_EOL); // multitextures if (!p_stMaterial->lMultiTexture) { if(strlen(p_stMaterial->sTexture[p_stMaterial->lCurTexture])) { SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionLoadTexture, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_stMaterial->sTexture[p_stMaterial->lCurTexture]); } } else { SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionLoadTexture, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].sLoad); } SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionTiling, SCR_CC_C_Cfg_NoChar); if (bChangeTiling || g_bIgnoreTex) { switch(MLT_vGetCyclingTextNameKey(p_stMaterial->sTexture[p_stMaterial->lCurTexture])) { case MLT_C_lCyclingUV : SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "ON,ON"); break; case MLT_C_lCyclingU : SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "ON,OFF"); break; case MLT_C_lCyclingV : SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "OFF,ON"); break; case MLT_C_lNoCycling : SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "OFF,OFF"); break; } } else SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 3, "%s,%s", p_stMaterial->sTilingFirst, p_stMaterial->sTilingSecond); SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionMipMapping, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, p_stMaterial->sMipMapping); SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionChromakey, SCR_CC_C_Cfg_NoChar); // Enable parameter if (MLT_vGetNonZeroTextNameKey(p_stMaterial->sTexture[p_stMaterial->lCurTexture])) strcpy(p_stMaterial->sEnable[p_stMaterial->lCurTexture], "ENABLE"); else strcpy(p_stMaterial->sEnable[p_stMaterial->lCurTexture], "DISABLE"); if (!bChange) { if(MLT_vGetNonZeroTextNameKey(p_stMaterial->sTexture[p_stMaterial->lCurTexture])) SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "ENABLE,FILTERING_ON,0,0,0,0"); else SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "DISABLE,FILTERING_OFF,0,0,0,0"); } else SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 7, "%s,%s,%d,%d,%d,%d", p_stMaterial->sEnable[p_stMaterial->lCurTexture],p_stMaterial->sOn[p_stMaterial->lCurTexture],p_stMaterial->iVal[0][p_stMaterial->lCurTexture],p_stMaterial->iVal[1][p_stMaterial->lCurTexture],p_stMaterial->iVal[2][p_stMaterial->lCurTexture],p_stMaterial->iVal[3][p_stMaterial->lCurTexture]); SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionQuality, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, p_stMaterial->sQuality[p_stMaterial->lCurTexture]); SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionPriority, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "LOW"); // multitextures if (p_stMaterial->lMultiTexture) { SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionLinarMipMapping, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].sLinarMipMapping); SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionCorrection, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].sPerspectiveCorrection); SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionBlendToColor, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%f,%f,%f", p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].fBlendToColor[0], p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].fBlendToColor[1], p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].fBlendToColor[2]); SCR_M_SvL0_SaveEntry(p_stFile, M_TEXActionBlendToAlpha, SCR_CC_C_Cfg_NoChar); SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 2, "%f", p_stMaterial->stMultiTexture[p_stMaterial->lCurTexture].fBlendToAlpha); } SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL); p_stMaterial->lCurTexture++; } /**************************************************************************** * Description: check texture name for cycling * * Parameters: d_ucFileName : texture name *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ long MLT_vGetCyclingTextNameKey (char *d_ucFileName) { long lLetterCount; unsigned char a4_ucDosExtend[4],a4_Extend[4]; MLT_v2LastLetters( d_ucFileName, a4_ucDosExtend ); for (lLetterCount = 0; lLetterCount < 256; lLetterCount ++) { if (d_ucFileName [lLetterCount] == 0) break; } if (strcmp(a4_ucDosExtend,"NZ") == 0) lLetterCount -=2; a4_Extend[0] = toupper (d_ucFileName [lLetterCount-7]); a4_Extend[1] = toupper (d_ucFileName [lLetterCount-6]); a4_Extend[2] = toupper (d_ucFileName [lLetterCount-5]); a4_Extend[3] = 0; if (strcmp(a4_Extend+1,"TX") == 0) return MLT_C_lCyclingU; if (strcmp(a4_Extend+1,"TY") == 0) return MLT_C_lCyclingV; if (strcmp(a4_Extend,"TXY") == 0) return MLT_C_lCyclingUV; return MLT_C_lNoCycling; } /**************************************************************************** * Description: check texture name for color key on * * Parameters: d_ucFileName : texture name *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ BOOL MLT_vGetNonZeroTextNameKey (char *d_ucFileName) { unsigned char a4_ucDosExtend[4]; MLT_v2LastLetters( d_ucFileName, a4_ucDosExtend ); if (strcmp(a4_ucDosExtend,"NZ") == 0) { return TRUE; } return FALSE; } /**************************************************************************** * Description: get last 2 letters of the texture name * * Parameters: d_ucFileName : texture name * a4_Extend : returns the last 2 letters *--------------------------------------------------------------------------- * Revision date: Author: *****************************************************************************/ void MLT_v2LastLetters (char *d_ucFileName , char *a4_Extend) { long lLetterCount; for ( lLetterCount = 0 ; lLetterCount < 256 ; lLetterCount ++ ) { if (d_ucFileName [lLetterCount] == 0) break; } a4_Extend[0] = toupper (d_ucFileName [lLetterCount-6]); a4_Extend[1] = toupper (d_ucFileName [lLetterCount-5]); a4_Extend[2] = 0; }