khanat-opennel-code/code/nel/tools/pacs/build_ig_boxes/main.cpp
2012-04-16 01:31:21 +02:00

234 lines
5.6 KiB
C++

// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "nel/misc/types_nl.h"
#include "nel/misc/time_nl.h"
#include "nel/misc/config_file.h"
#include "nel/misc/debug.h"
#include "nel/misc/path.h"
#include "nel/misc/common.h"
#include "nel/misc/displayer.h"
#include "nel/misc/file.h"
#include "nel/misc/matrix.h"
#include "nel/misc/aabbox.h"
#include "nel/3d/register_3d.h"
#include "nel/3d/scene_group.h"
#include "nel/3d/transform_shape.h"
#include "nel/3d/water_model.h"
#include "nel/3d/water_shape.h"
#include <string>
#include <map>
#include <deque>
#include <set>
#include <stdlib.h>
using namespace std;
using namespace NLMISC;
using namespace NL3D;
#ifndef NL_BIB_CFG
#define NL_BIB_CFG "."
#endif // NL_BIB_CFG
string Output;
string IGPath;
vector<string> IGs;
class CIGBox
{
public:
CIGBox() {}
CIGBox(const string &name, const CAABBox &bbox) : Name(name), BBox(bbox) {}
string Name;
CAABBox BBox;
void serial(NLMISC::IStream &f) { f.serial(Name, BBox); }
};
vector<CIGBox> Boxes;
set<string> NonWaterShapes;
//
int getInt(CConfigFile &cf, const string &varName)
{
CConfigFile::CVar &var = cf.getVar(varName);
return var.asInt();
}
string getString(CConfigFile &cf, const string &varName)
{
CConfigFile::CVar &var = cf.getVar(varName);
return var.asString();
}
void init()
{
registerSerial3d();
try
{
#ifdef NL_OS_UNIX
NLMISC::CPath::addSearchPath(NLMISC::CPath::getApplicationDirectory("NeL"));
#endif // NL_OS_UNIX
NLMISC::CPath::addSearchPath(NL_BIB_CFG);
CConfigFile cf;
uint i;
cf.load("build_ig_boxes.cfg");
Output = getString(cf, "Output");
// nlinfo("Output=%s", Output.c_str());
CConfigFile::CVar &cvIGs = cf.getVar("IGs");
for (i=0; i<cvIGs.size(); i++)
{
IGs.push_back(cvIGs.asString(i));
}
CConfigFile::CVar &cvPathes = cf.getVar("Pathes");
for (i=0; i<cvPathes.size(); ++i)
{
nlinfo("Using search path %s", cvPathes.asString(i).c_str());
CPath::addSearchPath(cvPathes.asString(i));
}
}
catch (const EConfigFile &e)
{
printf ("Problem in config file : %s\n", e.what ());
}
}
//
int main(int argc, char **argv)
{
// Filter addSearchPath
NLMISC::createDebug();
InfoLog->addNegativeFilter("adding the path");
createDebug();
CFileDisplayer fd(getLogDirectory() + "evallog.log", true);
try
{
// Init
init();
uint i, j, k;
for (i=0; i<IGs.size(); ++i)
{
// load ig associated to the zone
string igName = IGs[i]+".ig";
CIFile igStream(CPath::lookup(igName));
CInstanceGroup ig;
igStream.serial(ig);
CAABBox igBBox;
bool boxSet = false;
nlinfo("Generating BBOX for %s", igName.c_str());
// search in group for water instance
for (j=0; j<ig._InstancesInfos.size(); ++j)
{
/*
Ben: c'est degueulasse, mais c'est les coders a la 3D, y savent pas coder
Hld: ouai, mais ca marche pas ton truc, alors p'tet qu'on sait pas coder mais toi non plus :p Special Dedicace to SupaGreg!
string shapeName = ig._InstancesInfos[j].Name+".shape";
*/
string shapeName = ig._InstancesInfos[j].Name;
if (CFile::getExtension (shapeName) == "")
shapeName += ".shape";
if (NonWaterShapes.find(shapeName) != NonWaterShapes.end())
continue;
string shapeNameLookup = CPath::lookup (shapeName, false, false);
if (!shapeNameLookup.empty())
{
CIFile f;
if (f.open (shapeNameLookup))
{
CShapeStream shape;
shape.serial(f);
CWaterShape *wshape = dynamic_cast<CWaterShape *>(shape.getShapePointer());
if (wshape == NULL)
{
NonWaterShapes.insert(shapeName);
continue;
}
CMatrix matrix;
ig.getInstanceMatrix(j, matrix);
CPolygon wpoly;
wshape->getShapeInWorldSpace(wpoly);
for (k=0; k<wpoly.Vertices.size(); ++k)
{
if (boxSet)
{
igBBox.extend(matrix * wpoly.Vertices[k]);
}
else
{
igBBox.setCenter(matrix * wpoly.Vertices[k]);
boxSet = true;
}
}
}
else
{
nlwarning ("Can't load shape %s", shapeNameLookup.c_str());
}
}
else
{
NonWaterShapes.insert(shapeName);
}
}
if (boxSet)
{
Boxes.push_back(CIGBox(igName, igBBox));
nlinfo("Bbox: (%.1f,%.1f)-(%.1f,%.1f)", igBBox.getMin().x, igBBox.getMin().y, igBBox.getMax().x, igBBox.getMax().y);
}
}
COFile output(Output);
output.serialCont(Boxes);
}
catch (const Exception &e)
{
fprintf (stderr,"main trapped an exception: '%s'\n", e.what ());
}
#ifndef NL_DEBUG
catch (...)
{
fprintf(stderr,"main trapped an unknown exception\n");
}
#endif // NL_DEBUG
return 0;
}