reman3/Rayman_X/cpa/tempgrp/TGM/Src/templates.cxx

238 lines
9.9 KiB
C++

#if !defined(D_tdoMaterialClass)
#error "define the class before including this file"
#endif
//================================================================================
//================================================================================
void vKillMaterialList(D_tdoMaterialClass *_p_oDummyArgToEnableOverLoading, CComboBox *_p_oReferencingCombo)
{
_p_oDummyArgToEnableOverLoading = _p_oDummyArgToEnableOverLoading;
CPA_List<CPA_BaseObject> oEditorObjectList;
gs_p_oMaterialInterface->GetMainWorld()->fn_lFindObjects(
&oEditorObjectList,
"", D_tdoMaterialClass::m_csGetMaterialType(),
NO_CRITERIA /* owner */
);
/* and destroy them all */
while ( !oEditorObjectList.IsEmpty() )
{
D_tdoMaterialClass *p_oMaterial = (D_tdoMaterialClass *) oEditorObjectList.RemoveHead();
/* and delete the object, it will handle cohemngr links removal itself */
delete p_oMaterial;
}
//reset the referencing combobox
if ( _p_oReferencingCombo )
{
_p_oReferencingCombo->ResetContent();
_p_oReferencingCombo->AddString(C_szNoMaterialComboEntry);
_p_oReferencingCombo->SetItemDataPtr(0, NULL);
}
}
//================================================================================
//================================================================================
#if defined(D_tdxEngineMaterialHandle)
void vRefreshMaterialList(
long _lStartInLinkTable,
D_tdoMaterialClass *_p_oDummyArgToEnableOverLoading,
BOOL _bSectionsAnalysedWithFullNames,
CComboBox *_p_oReferencingCombo
)
{
_p_oDummyArgToEnableOverLoading = _p_oDummyArgToEnableOverLoading;
/* scan all loaded engine materials and associate editor materials to them... */
SCR_tdst_Link_Value *p_stMaterialEntry;
SCR_tdst_Link_Table *p_stMaterialLinkTable = D_tdoMaterialClass::m_p_stGetAssociatedLinkTable();
CString csStatusMessage;
csStatusMessage.Format("linking %d editor and engine materials", p_stMaterialLinkTable->stLinkArray.uiNumValues);
/* start the scan */
unsigned int uiMaterialPos = _lStartInLinkTable;
SCR_M_DyAr_GetNextElement(
SCR_tdst_Link_Value,
uiMaterialPos,
p_stMaterialEntry,
p_stMaterialLinkTable->stLinkArray
);
/* while there are entries in the list */
while ( p_stMaterialEntry )
{
fn_vGiveProgressInfo(
csStatusMessage,
(uiMaterialPos * 100) / p_stMaterialLinkTable->stLinkArray.uiNumValues
);
D_tdxEngineMaterialHandle hEngineMaterial = (D_tdxEngineMaterialHandle) SCR_M_ul_Link_GetValue(p_stMaterialEntry);
//see if an editor material exists for this engine material (which means it was referenced somewhere)
D_tdoMaterialClass *p_oInsertedMaterial = (D_tdoMaterialClass *) gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hEngineMaterial);
if
(
SCR_M_e_Link_GetState(p_stMaterialEntry) == SCR_ELS_Link_Initialized
&& !p_oInsertedMaterial //the engine material was not referenced
)
{ /* we did not find an editor material for the engine material */
/* if we did not find a material with the engine, try to find one with the name, in case the script was */
/* parsed and editor materials were created for unloaded sections -> they have no valid engine material */
/* search OwnerFile */
CPA_FileObject *p_oOwnerFile;
CString csKey(SCR_M_p_sz_Link_GetKey(p_stMaterialEntry));
CString csName(gs_p_oMaterialInterface->m_csGetFilePartOfSectionName(csKey));
//create editor materials only if the file in which the engine material exists is of the good extension
if ( !D_tdoMaterialClass::m_csGetScriptExtension().CompareNoCase(strrchr(LPCTSTR(csName), '.')) )
{
/* extract the id from the key */
csKey = gs_p_oMaterialInterface->m_csGetIdPartOfSectionName(csKey);
//this wont work if csName is a full name, so get the file from the full name instead.
//that way we are sure to get a preexisting fileobject when there is one
p_oOwnerFile = p_oGetFileObjectForReferencedPath(csName, C_szFileReferencedNameKey);
if ( !p_oOwnerFile )
p_oOwnerFile = p_oGetFileObjectForReferencedPath(csName, "");
if ( p_oOwnerFile )
p_oInsertedMaterial = (D_tdoMaterialClass *) gs_p_oMaterialInterface->GetBaseObject(
csKey,
D_tdoMaterialClass::m_csGetMaterialType(),
p_oOwnerFile
);
if ( p_oInsertedMaterial )
{
/* give the engine material to the editor material */
p_oInsertedMaterial->m_vAssociateEngineMaterial(hEngineMaterial, TRUE);
}
else
{
ASSERT(D_tdoMaterialClass::m_bIsEngineMaterialValid(hEngineMaterial));
/* Create a new editor material to handle this engine material */
//CString csPath(D_tdoMaterialClass::m_csGetBaseDataPath());
if ( csName.Find('/') != -1 )
AfxMessageBox(
"Find where\n" + csKey + "\nis referenced and change all '/' characters to '\\'s",
MB_OK | MB_ICONSTOP
);
if ( p_oOwnerFile )
p_oInsertedMaterial = new D_tdoMaterialClass(
p_oOwnerFile,
csKey,
TRUE,
hEngineMaterial
);
}
}
}
if ( _p_oReferencingCombo && p_oInsertedMaterial )
{
CString csName = p_oInsertedMaterial->GetName();
short wIndex = _p_oReferencingCombo->FindStringExact(-1, csName);
if ( wIndex == CB_ERR ) //if the material is not already in the combo
{ //add it
wIndex = _p_oReferencingCombo->AddString(csName);
_p_oReferencingCombo->SetItemDataPtr(wIndex, p_oInsertedMaterial);
}
}
uiMaterialPos ++;
SCR_M_DyAr_GetNextElement(
SCR_tdst_Link_Value,
uiMaterialPos,
p_stMaterialEntry,
p_stMaterialLinkTable->stLinkArray
);
}
/* if all editor materials were destroyed, we have to parse the file again */
/* to build editor materials for the remaining sections for all gmt files! */
if ( gs_p_oMaterialInterface->m_eGetRefreshListMode() == E_rlm_DestroyAndRebuild )
{
CPA_BaseObjectList *p_oFileList = gs_p_oMaterialInterface->GetMainWorld()->fn_p_oGetOriginalObjectList(C_szFileTypeName);
Position xPos = p_oFileList->GetHeadPosition();
while ( xPos )
{
CPA_FileObject *p_oFileObject = (CPA_FileObject *) p_oFileList->GetNext(xPos);
CString csName;
//if the sections were analyzed with the full name, the file in which the scripts found them
//is known with its long name as well, else it is known with its referenced name
if ( _bSectionsAnalysedWithFullNames )
csName = p_oFileObject->GetCompleteName();
else
csName = p_oFileObject->GetReferencedName(gs_p_oMaterialInterface, C_szFileReferencedNameKey);
const char *pszName = LPCTSTR(csName);
const char *pszNameExtension = strrchr((char*)pszName, '.');
if
(
((pszNameExtension == NULL) ? FALSE : TRUE)
&& (!(D_tdoMaterialClass::m_csGetScriptExtension().CompareNoCase(pszNameExtension)))
&& (SCR_fn_c_RdL0_IsSectionExists((char *) pszName)) //the file must exist...
)
{
/* now lets load the other sections in the script files that are not used by the engine */
SCR_fn_v_RdL0_OpenFile((char*)pszName); //force file parsing, just in case
SCR_tdst_File_Open *p_stFile = SCR_fnp_st_RdL0_GetOpenFile((char*)pszName);
csStatusMessage.Format("creating %d unreferenced materials of %s", p_stFile->stSectionsDes.uiNumValues, pszName);
//start the scan
uiMaterialPos = 0;
SCR_tdst_Anl_SectionDes *p_stSectionDesc;
SCR_M_DyAr_GetNextElement(
SCR_tdst_Anl_SectionDes,
uiMaterialPos,
p_stSectionDesc,
p_stFile->stSectionsDes
);
while ( p_stSectionDesc )
{
fn_vGiveProgressInfo(csStatusMessage, (uiMaterialPos * 100) / p_stFile->stSectionsDes.uiNumValues);
D_tdoMaterialClass *p_oInsertedMaterial = NULL;
if ( !p_stSectionDesc->p_stOpenSection ) /* handle only sections that are not yet analyzed */
{
//find if an object with the same identification already exists (because we never know...)
p_oInsertedMaterial = (D_tdoMaterialClass *) gs_p_oMaterialInterface->GetBaseObject(
CString(p_stSectionDesc->stBuffers.p_szBufferNameExt), //to make sure the correct overload is specified
D_tdoMaterialClass::m_csGetMaterialType(),
p_oFileObject
);
//if we found one, the material that created it was not aware that the section existed,
//so correct it now
if ( p_oInsertedMaterial )
p_oInsertedMaterial->SetExistingSection(TRUE);
else //if we did not find such an editor object, create it
{
D_tdxEngineMaterialHandle hInvalidMaterial;
D_tdoMaterialClass::m_vInvalidateEngineMaterial(hInvalidMaterial);
p_oInsertedMaterial = new D_tdoMaterialClass(
p_oFileObject,
p_stSectionDesc->stBuffers.p_szBufferNameExt,
TRUE,
hInvalidMaterial
);
if ( _p_oReferencingCombo )
{
CString csName = p_oInsertedMaterial->GetName();
short wIndex = _p_oReferencingCombo->FindStringExact(-1, csName);
if ( wIndex == CB_ERR ) //if the material is not already in the combo
{ //add it
wIndex = _p_oReferencingCombo->AddString(csName);
_p_oReferencingCombo->SetItemDataPtr(wIndex, p_oInsertedMaterial);
}
}
}
}
uiMaterialPos ++;
SCR_M_DyAr_GetNextElement(
SCR_tdst_Anl_SectionDes,
uiMaterialPos,
p_stSectionDesc,
p_stFile->stSectionsDes
);
} /* section loop */
fn_vGiveProgressInfo(csStatusMessage, 100);
} /* gmt file test */
} /* gmt file loop */
} /* destroy and rebuild test */
fn_vGiveProgressInfo("", -1);
}
#endif
#undef D_tdoMaterialClass
#undef D_tdxEngineMaterialHandle