|
|
@ -2402,55 +2402,79 @@ void CExport::transformCMB (const std::string &name, const NLMISC::CMatrix &tran
|
|
|
|
_ExportCB->dispWarning("Can't find " + cmbNoExtension + ".cmb");
|
|
|
|
_ExportCB->dispWarning("Can't find " + cmbNoExtension + ".cmb");
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
CIFile inStream;
|
|
|
|
std::string outFileName = _Options->OutCMBDir +"/" + cmbNoExtension + ".cmb";
|
|
|
|
if (inStream.open(cmbName))
|
|
|
|
bool needUpdate = true;
|
|
|
|
|
|
|
|
if (CFile::fileExists(outFileName))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
try
|
|
|
|
uint32 outModification = CFile::getFileModificationDate(outFileName);
|
|
|
|
|
|
|
|
needUpdate =
|
|
|
|
|
|
|
|
CFile::getFileModificationDate(cmbName) > outModification
|
|
|
|
|
|
|
|
|| (CFile::fileExists(_Options->HeightMapFile) && (CFile::getFileModificationDate(_Options->HeightMapFile) > outModification))
|
|
|
|
|
|
|
|
|| (CFile::fileExists(_Options->HeightMapFile2) && (CFile::getFileModificationDate(_Options->HeightMapFile2) > outModification))
|
|
|
|
|
|
|
|
|| (CFile::fileExists(_Options->ContinentFile) && (CFile::getFileModificationDate(_Options->ContinentFile) > outModification))
|
|
|
|
|
|
|
|
|| (CFile::fileExists(_Options->ZoneRegionFile) && (CFile::getFileModificationDate(_Options->ZoneRegionFile) > outModification));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (needUpdate)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
|
|
|
|
_ExportCB->dispInfo("UPDATE " + cmbName);
|
|
|
|
|
|
|
|
printf("UPDATE %s\n", cmbName.c_str());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CIFile inStream;
|
|
|
|
|
|
|
|
if (inStream.open(cmbName))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
CCollisionMeshBuild cmb;
|
|
|
|
try
|
|
|
|
cmb.serial(inStream);
|
|
|
|
|
|
|
|
// translate and save
|
|
|
|
|
|
|
|
cmb.transform (transfo);
|
|
|
|
|
|
|
|
COFile outStream;
|
|
|
|
|
|
|
|
std::string outFileName = _Options->OutCMBDir +"/" + cmbNoExtension + ".cmb";
|
|
|
|
|
|
|
|
if (!outStream.open(outFileName))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
|
|
|
|
_ExportCB->dispWarning("Couldn't open " + outFileName + "for writing, not exporting");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
try
|
|
|
|
CCollisionMeshBuild cmb;
|
|
|
|
|
|
|
|
cmb.serial(inStream);
|
|
|
|
|
|
|
|
// translate and save
|
|
|
|
|
|
|
|
cmb.transform (transfo);
|
|
|
|
|
|
|
|
COFile outStream;
|
|
|
|
|
|
|
|
if (!outStream.open(outFileName))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cmb.serial(outStream);
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
outStream.close();
|
|
|
|
_ExportCB->dispWarning("Couldn't open " + outFileName + "for writing, not exporting");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const EStream &e)
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
outStream.close();
|
|
|
|
try
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_ExportCB->dispWarning("Error while writing " + outFileName);
|
|
|
|
cmb.serial(outStream);
|
|
|
|
_ExportCB->dispWarning(e.what());
|
|
|
|
outStream.close();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (const EStream &e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
outStream.close();
|
|
|
|
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
_ExportCB->dispWarning("Error while writing " + outFileName);
|
|
|
|
|
|
|
|
_ExportCB->dispWarning(e.what());
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inStream.close();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (const EStream &e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
inStream.close();
|
|
|
|
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
_ExportCB->dispWarning("Error while reading " + cmbName);
|
|
|
|
|
|
|
|
_ExportCB->dispWarning(e.what());
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
inStream.close();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const EStream &e)
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
inStream.close();
|
|
|
|
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
{
|
|
|
|
_ExportCB->dispWarning("Unable to open " + cmbName);
|
|
|
|
_ExportCB->dispWarning("Error while reading " + cmbName);
|
|
|
|
|
|
|
|
_ExportCB->dispWarning(e.what());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
_ExportCB->dispWarning("Unable to open " + cmbName);
|
|
|
|
_ExportCB->dispInfo("SKIP " + cmbName);
|
|
|
|
|
|
|
|
printf("SKIP %s\n", cmbName.c_str());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -2471,98 +2495,122 @@ void CExport::transformAdditionnalIG (const std::string &name, const NLMISC::CMa
|
|
|
|
_ExportCB->dispWarning("Can't find " + igNoExtension + ".cmb");
|
|
|
|
_ExportCB->dispWarning("Can't find " + igNoExtension + ".cmb");
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
CIFile inStream;
|
|
|
|
std::string outFileName = _Options->AdditionnalIGOutDir +"/" + igNoExtension + ".ig";
|
|
|
|
if (inStream.open(igName))
|
|
|
|
bool needUpdate = true;
|
|
|
|
|
|
|
|
if (CFile::fileExists(outFileName))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
try
|
|
|
|
uint32 outModification = CFile::getFileModificationDate(outFileName);
|
|
|
|
|
|
|
|
needUpdate =
|
|
|
|
|
|
|
|
CFile::getFileModificationDate(igName) > outModification
|
|
|
|
|
|
|
|
|| (CFile::fileExists(_Options->HeightMapFile) && (CFile::getFileModificationDate(_Options->HeightMapFile) > outModification))
|
|
|
|
|
|
|
|
|| (CFile::fileExists(_Options->HeightMapFile2) && (CFile::getFileModificationDate(_Options->HeightMapFile2) > outModification))
|
|
|
|
|
|
|
|
|| (CFile::fileExists(_Options->ContinentFile) && (CFile::getFileModificationDate(_Options->ContinentFile) > outModification))
|
|
|
|
|
|
|
|
|| (CFile::fileExists(_Options->ZoneRegionFile) && (CFile::getFileModificationDate(_Options->ZoneRegionFile) > outModification));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (needUpdate)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
|
|
|
|
_ExportCB->dispInfo("UPDATE " + igName);
|
|
|
|
|
|
|
|
printf("UPDATE %s\n", igName.c_str());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CIFile inStream;
|
|
|
|
|
|
|
|
if (inStream.open(igName))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
CInstanceGroup ig, igOut;
|
|
|
|
try
|
|
|
|
ig.serial(inStream);
|
|
|
|
{
|
|
|
|
|
|
|
|
CInstanceGroup ig, igOut;
|
|
|
|
|
|
|
|
ig.serial(inStream);
|
|
|
|
|
|
|
|
|
|
|
|
CVector globalPos;
|
|
|
|
CVector globalPos;
|
|
|
|
CInstanceGroup::TInstanceArray IA;
|
|
|
|
CInstanceGroup::TInstanceArray IA;
|
|
|
|
std::vector<CCluster> Clusters;
|
|
|
|
std::vector<CCluster> Clusters;
|
|
|
|
std::vector<CPortal> Portals;
|
|
|
|
std::vector<CPortal> Portals;
|
|
|
|
std::vector<CPointLightNamed> PLN;
|
|
|
|
std::vector<CPointLightNamed> PLN;
|
|
|
|
|
|
|
|
|
|
|
|
ig.retrieve(globalPos, IA, Clusters, Portals, PLN);
|
|
|
|
ig.retrieve(globalPos, IA, Clusters, Portals, PLN);
|
|
|
|
bool realTimeSuncontribution = ig.getRealTimeSunContribution();
|
|
|
|
bool realTimeSuncontribution = ig.getRealTimeSunContribution();
|
|
|
|
|
|
|
|
|
|
|
|
uint k;
|
|
|
|
uint k;
|
|
|
|
// elevate instance
|
|
|
|
// elevate instance
|
|
|
|
for(k = 0; k < IA.size(); ++k)
|
|
|
|
for(k = 0; k < IA.size(); ++k)
|
|
|
|
{
|
|
|
|
|
|
|
|
IA[k].Pos = transfo * IA[k].Pos;
|
|
|
|
|
|
|
|
IA[k].Rot = rotTransfo * IA[k].Rot;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// lights
|
|
|
|
|
|
|
|
for(k = 0; k < PLN.size(); ++k)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
PLN[k].setPosition(transfo * PLN[k].getPosition());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// portals
|
|
|
|
|
|
|
|
std::vector<CVector> portal;
|
|
|
|
|
|
|
|
for(k = 0; k < Portals.size(); ++k)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Portals[k].getPoly(portal);
|
|
|
|
|
|
|
|
for(uint l = 0; l < portal.size(); ++l)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
portal[l] = transfo * portal[l];
|
|
|
|
IA[k].Pos = transfo * IA[k].Pos;
|
|
|
|
|
|
|
|
IA[k].Rot = rotTransfo * IA[k].Rot;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// lights
|
|
|
|
|
|
|
|
for(k = 0; k < PLN.size(); ++k)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
PLN[k].setPosition(transfo * PLN[k].getPosition());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// portals
|
|
|
|
|
|
|
|
std::vector<CVector> portal;
|
|
|
|
|
|
|
|
for(k = 0; k < Portals.size(); ++k)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Portals[k].getPoly(portal);
|
|
|
|
|
|
|
|
for(uint l = 0; l < portal.size(); ++l)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
portal[l] = transfo * portal[l];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Portals[k].setPoly(portal);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Portals[k].setPoly(portal);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// clusters
|
|
|
|
// clusters
|
|
|
|
for(k = 0; k < Clusters.size(); ++k)
|
|
|
|
for(k = 0; k < Clusters.size(); ++k)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Clusters[k].applyMatrix (transfo);
|
|
|
|
Clusters[k].applyMatrix (transfo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
igOut.build(globalPos, IA, Clusters, Portals, PLN);
|
|
|
|
igOut.build(globalPos, IA, Clusters, Portals, PLN);
|
|
|
|
igOut.enableRealTimeSunContribution(realTimeSuncontribution);
|
|
|
|
igOut.enableRealTimeSunContribution(realTimeSuncontribution);
|
|
|
|
|
|
|
|
|
|
|
|
COFile outStream;
|
|
|
|
COFile outStream;
|
|
|
|
std::string outFileName = _Options->AdditionnalIGOutDir +"/" + igNoExtension + ".ig";
|
|
|
|
if (!outStream.open(outFileName))
|
|
|
|
if (!outStream.open(outFileName))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
|
|
|
|
_ExportCB->dispWarning("Couldn't open " + outFileName + "for writing, not exporting");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
igOut.serial(outStream);
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
outStream.close();
|
|
|
|
_ExportCB->dispWarning("Couldn't open " + outFileName + "for writing, not exporting");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const EStream &e)
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
outStream.close();
|
|
|
|
try
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_ExportCB->dispWarning("Error while writing " + outFileName);
|
|
|
|
igOut.serial(outStream);
|
|
|
|
_ExportCB->dispWarning(e.what());
|
|
|
|
outStream.close();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (const EStream &e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
outStream.close();
|
|
|
|
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
_ExportCB->dispWarning("Error while writing " + outFileName);
|
|
|
|
|
|
|
|
_ExportCB->dispWarning(e.what());
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inStream.close();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (const EStream &e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
inStream.close();
|
|
|
|
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
_ExportCB->dispWarning("Error while reading " + igName);
|
|
|
|
|
|
|
|
_ExportCB->dispWarning(e.what());
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
inStream.close();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const EStream &e)
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
inStream.close();
|
|
|
|
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
{
|
|
|
|
_ExportCB->dispWarning("Unable to open " + igName);
|
|
|
|
_ExportCB->dispWarning("Error while reading " + igName);
|
|
|
|
|
|
|
|
_ExportCB->dispWarning(e.what());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
if (_ExportCB != NULL)
|
|
|
|
_ExportCB->dispWarning("Unable to open " + igName);
|
|
|
|
_ExportCB->dispInfo("SKIP " + igName);
|
|
|
|
|
|
|
|
printf("SKIP %s\n", igName.c_str());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|