/**
* \file scene_class_registry.cpp
* \brief CSceneClassRegistry
* \date 2012-08-20 09:57GMT
* \author Jan Boon (Kaetemi)
* CSceneClassRegistry
*/
/*
* Copyright (C) 2012 by authors
*
* This file is part of RYZOM CORE PIPELINE.
* RYZOM CORE PIPELINE 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.
*
* RYZOM CORE PIPELINE 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 RYZOM CORE PIPELINE. If not, see
* .
*/
#include
#include "scene_class_registry.h"
// STL includes
#include
// NeL includes
// #include
// Project includes
using namespace std;
// using namespace NLMISC;
namespace PIPELINE {
namespace MAX {
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
// Elevate warnings to errors in this file for stricter reading
#undef nlwarning
#define nlwarning nlerror
// Elevate debug to error in this file for debugging
// #undef nldebug
// #define nldebug nlerror
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
CSceneClassRegistry::CSceneClassRegistry()
{
}
CSceneClassRegistry::~CSceneClassRegistry()
{
}
void CSceneClassRegistry::add(const ISceneClassDesc *desc)
{
TKey key(desc->superClassId(), desc->classId());
if (m_ClassDescriptions.find(key) != m_ClassDescriptions.end()) { nlerror("Already added this class to the registry"); return; }
m_ClassDescriptions[key] = desc;
}
void CSceneClassRegistry::remove(const TSClassId superClassId, const NLMISC::CClassId classId)
{
TKey key(superClassId, classId);
if (m_ClassDescriptions.find(key) == m_ClassDescriptions.end()) { nlwarning("Try to remove class that is not found"); return; }
m_ClassDescriptions.erase(key);
}
/// Add a superclass to the registry
void CSceneClassRegistry::add(const ISuperClassDesc *desc)
{
// nldebug("Register superclass 0x%x", desc->superClassId());
if (m_SuperClassDescriptions.find(desc->superClassId()) != m_SuperClassDescriptions.end()) { nlerror("Already added this superclass to the registry"); return; }
m_SuperClassDescriptions[desc->superClassId()] = desc;
}
/// Remove a superclass from the registry
void CSceneClassRegistry::remove(const TSClassId superClassId)
{
if (m_SuperClassDescriptions.find(superClassId) == m_SuperClassDescriptions.end()) { nlwarning("Try to remove superclass that is not found"); return; }
m_SuperClassDescriptions.erase(superClassId);
}
/// Create a class by class id
CSceneClass *CSceneClassRegistry::create(CScene *scene, const TSClassId superClassId, const NLMISC::CClassId classId) const
{
TKey key(superClassId, classId);
if (m_ClassDescriptions.find(key) == m_ClassDescriptions.end()) { /* nldebug("Try to create class that does not exist"); */ return NULL; }
return m_ClassDescriptions.find(key)->second->create(scene);
}
/// Create an unknown class by superclass id
CSceneClass *CSceneClassRegistry::createUnknown(CScene *scene, TSClassId superClassId, const NLMISC::CClassId classId, const ucstring &displayName, const ucstring &dllFilename, const ucstring &dllDescription) const
{
if (m_SuperClassDescriptions.find(superClassId) == m_SuperClassDescriptions.end()) { nlwarning("Creating superclass 0x%x (%s) %s that does not exist", superClassId, displayName.toUtf8().c_str(), classId.toString().c_str()); return NULL; }
return m_SuperClassDescriptions.find(superClassId)->second->createUnknown(scene, classId, displayName, dllFilename, dllDescription);
}
/// Destroy a class by pointer
void CSceneClassRegistry::destroy(CSceneClass *sceneClass) const
{
sceneClass->classDesc()->destroy(sceneClass);
}
/// Return the description of a class by class id
const ISceneClassDesc *CSceneClassRegistry::describe(const TSClassId superClassId, const NLMISC::CClassId classId) const
{
TKey key(superClassId, classId);
if (m_ClassDescriptions.find(key) == m_ClassDescriptions.end()) { nldebug("Try to describe class that does not exist"); return NULL; }
return m_ClassDescriptions.find(key)->second;
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
CSceneClassRegistry::TKey::TKey(TSClassId superClassId, NLMISC::CClassId classId) : SuperClassId(superClassId), ClassId(classId)
{
}
bool CSceneClassRegistry::TKey::operator<(const CSceneClassRegistry::TKey &right) const
{
if (SuperClassId < right.SuperClassId)
return true;
if (SuperClassId > right.SuperClassId)
return false;
if (ClassId < right.ClassId)
return true;
if (ClassId > right.ClassId)
return false;
return false;
}
bool CSceneClassRegistry::TKey::operator>(const CSceneClassRegistry::TKey &right) const
{
if (SuperClassId > right.SuperClassId)
return true;
if (SuperClassId < right.SuperClassId)
return false;
if (ClassId > right.ClassId)
return true;
if (ClassId < right.ClassId)
return false;
return false;
}
bool CSceneClassRegistry::TKey::operator==(const CSceneClassRegistry::TKey &right) const
{
return ClassId == right.ClassId && SuperClassId == right.SuperClassId;
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
} /* namespace MAX */
} /* namespace PIPELINE */
/* end of file */