Added: #1440 Parser for scene container

--HG--
branch : build_pipeline_v3
hg/feature/build_pipeline_v3
kaetemi 12 years ago
parent dee1431c97
commit 28e4b2c76c

@ -35,6 +35,10 @@
#include <nel/misc/ucstring.h> #include <nel/misc/ucstring.h>
// Project includes // Project includes
#include "dll_directory.h"
#include "class_directory_3.h"
#include "scene_class_registry.h"
#include "scene_class_unknown.h"
using namespace std; using namespace std;
// using namespace NLMISC; // using namespace NLMISC;
@ -46,7 +50,7 @@ namespace MAX {
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
CScene::CScene() CScene::CScene(const CSceneClassRegistry *sceneClassRegistry, CDllDirectory *dllDirectory, CClassDirectory3 *classDirectory3) : m_SceneClassRegistry(sceneClassRegistry), m_DllDirectory(dllDirectory), m_ClassDirectory3(classDirectory3)
{ {
} }
@ -69,6 +73,7 @@ void CScene::toString(std::ostream &ostream, const std::string &pad)
void CScene::parse(uint16 version, TParseLevel level) void CScene::parse(uint16 version, TParseLevel level)
{ {
CStorageContainer::parse(version, level); CStorageContainer::parse(version, level);
nlassert(Chunks.size() == 1);
} }
void CScene::clean() void CScene::clean()
@ -78,6 +83,7 @@ void CScene::clean()
void CScene::build(uint16 version) void CScene::build(uint16 version)
{ {
nlassert(Chunks.size() == 1);
CStorageContainer::build(version); CStorageContainer::build(version);
} }
@ -86,12 +92,24 @@ void CScene::disown()
CStorageContainer::disown(); CStorageContainer::disown();
} }
uint16 CScene::version()
{
nlassert(Chunks.size() == 1);
return Chunks.begin()->first;
}
CSceneClassContainer *CScene::container()
{
nlassert(Chunks.size() == 1);
return static_cast<CSceneClassContainer *>(Chunks.begin()->second);
}
IStorageObject *CScene::createChunkById(uint16 id, bool container) IStorageObject *CScene::createChunkById(uint16 id, bool container)
{ {
if (container) if (container)
{ {
// Return the scene class container. There can be only one. // Return the scene class container. There can be only one.
return new CSceneClassContainer(); return new CSceneClassContainer(m_SceneClassRegistry, m_DllDirectory, m_ClassDirectory3);
} }
return CStorageContainer::createChunkById(id, container); return CStorageContainer::createChunkById(id, container);
} }
@ -100,7 +118,7 @@ IStorageObject *CScene::createChunkById(uint16 id, bool container)
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
CSceneClassContainer::CSceneClassContainer() CSceneClassContainer::CSceneClassContainer(const CSceneClassRegistry *sceneClassRegistry, CDllDirectory *dllDirectory, CClassDirectory3 *classDirectory3) : m_SceneClassRegistry(sceneClassRegistry), m_DllDirectory(dllDirectory), m_ClassDirectory3(classDirectory3)
{ {
} }
@ -142,13 +160,20 @@ void CSceneClassContainer::disown()
IStorageObject *CSceneClassContainer::createChunkById(uint16 id, bool container) IStorageObject *CSceneClassContainer::createChunkById(uint16 id, bool container)
{ {
if (container) nldebug("Scene class id %x (%i)", (uint32)id, (uint32)id);
const CClassEntry *classEntry = m_ClassDirectory3->get(id);
CSceneClass *sceneClass = m_SceneClassRegistry->create(classEntry->classId());
if (sceneClass)
{ {
// TODO: Check the class registry. return static_cast<IStorageObject *>(sceneClass);
// Return default unknown scene class.
return new CSceneClass();
} }
return CStorageContainer::createChunkById(id, container); else
{
// Create an unknown scene class
const CDllEntry *dllEntry = m_DllDirectory->get(classEntry->dllIndex());
return static_cast<IStorageObject *>(new CSceneClassUnknown(dllEntry, classEntry));
}
throw EStorage("Bad scene class id");
} }
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////

@ -42,6 +42,14 @@
namespace PIPELINE { namespace PIPELINE {
namespace MAX { namespace MAX {
// Registry containing available scene classes
class CSceneClassRegistry;
// Storage
class CDllDirectory;
class CClassDirectory3;
class CSceneClassContainer;
/** /**
* \brief CScene * \brief CScene
* \date 2012-08-19 19:25GMT * \date 2012-08-19 19:25GMT
@ -51,7 +59,7 @@ namespace MAX {
class CScene : public CStorageContainer class CScene : public CStorageContainer
{ {
public: public:
CScene(); CScene(const CSceneClassRegistry *sceneClassRegistry, CDllDirectory *dllDirectory, CClassDirectory3 *classDirectory3);
virtual ~CScene(); virtual ~CScene();
// inherited // inherited
@ -62,9 +70,18 @@ public:
virtual void build(uint16 version); virtual void build(uint16 version);
virtual void disown(); virtual void disown();
// public
uint16 version();
CSceneClassContainer *container();
protected: protected:
virtual IStorageObject *createChunkById(uint16 id, bool container); virtual IStorageObject *createChunkById(uint16 id, bool container);
private:
const CSceneClassRegistry *m_SceneClassRegistry;
CDllDirectory *m_DllDirectory;
CClassDirectory3 *m_ClassDirectory3;
}; /* class CScene */ }; /* class CScene */
/** /**
@ -76,7 +93,7 @@ protected:
class CSceneClassContainer : public CStorageContainer class CSceneClassContainer : public CStorageContainer
{ {
public: public:
CSceneClassContainer(); CSceneClassContainer(const CSceneClassRegistry *sceneClassRegistry, CDllDirectory *dllDirectory, CClassDirectory3 *classDirectory3);
virtual ~CSceneClassContainer(); virtual ~CSceneClassContainer();
// inherited // inherited
@ -90,6 +107,11 @@ public:
protected: protected:
virtual IStorageObject *createChunkById(uint16 id, bool container); virtual IStorageObject *createChunkById(uint16 id, bool container);
private:
const CSceneClassRegistry *m_SceneClassRegistry;
CDllDirectory *m_DllDirectory;
CClassDirectory3 *m_ClassDirectory3;
}; /* class CSceneClassContainer */ }; /* class CSceneClassContainer */
} /* namespace MAX */ } /* namespace MAX */

@ -51,6 +51,17 @@ CSceneClassRegistry::~CSceneClassRegistry()
} }
//void CSceneClassRegistry::add(const NLMISC::CClassId, const ISceneClassDesc *desc);
//void CSceneClassRegistry::remove(const NLMISC::CClassId);
CSceneClass *CSceneClassRegistry::create(const NLMISC::CClassId classid) const
{
return NULL; // TODO
}
//void CSceneClassRegistry::destroy(CSceneClass *sceneClass) const;
//const CSceneClassRegistry::ISceneClassDesc *describe(const NLMISC::CClassId classid) const;
} /* namespace MAX */ } /* namespace MAX */
} /* namespace PIPELINE */ } /* namespace PIPELINE */

@ -25,6 +25,7 @@
#include "../max/class_data.h" #include "../max/class_data.h"
#include "../max/config.h" #include "../max/config.h"
#include "../max/scene.h" #include "../max/scene.h"
#include "../max/scene_class_registry.h"
//static const char *filename = "/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max"; //static const char *filename = "/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max";
static const char *filename = "/home/kaetemi/source/minimax/GE_Acc_MikotoBaniere.max"; static const char *filename = "/home/kaetemi/source/minimax/GE_Acc_MikotoBaniere.max";
@ -41,6 +42,10 @@ int main(int argc, char **argv)
g_set_prgname(me); g_set_prgname(me);
gsf_init(); gsf_init();
PIPELINE::MAX::CSceneClassRegistry sceneClassRegistry;
GsfInfile *infile; GsfInfile *infile;
GError *error = NULL; GError *error = NULL;
GsfInput *src; GsfInput *src;
@ -132,6 +137,28 @@ int main(int argc, char **argv)
//std::cout << "\n"; //std::cout << "\n";
std::cout << "\n";
PIPELINE::MAX::CScene scene(&sceneClassRegistry, &dllDirectory, &classDirectory3);
input = gsf_infile_child_by_name(infile, "Scene");
{
PIPELINE::MAX::CStorageStream instream(input);
scene.serial(instream);
}
g_object_unref(input);
//classDirectory3.toString(std::cout);
//std::cout << "\n";
scene.parse(PIPELINE::MAX::VersionUnknown, PIPELINE::MAX::PARSE_INTERNAL); // parse the structure to readable data
scene.clean(); // cleanup unused file structure
scene.toString(std::cout);
std::cout << "\n";
//classDirectory3.build(PIPELINE::MAX::VersionUnknown);
//classDirectory3.disown();
//classDirectory3.toString(std::cout);
//std::cout << "\n";
/* /*
GsfInput *input = gsf_infile_child_by_name(infile, streamname); GsfInput *input = gsf_infile_child_by_name(infile, streamname);

Loading…
Cancel
Save