Files
bullet3/Extras/COLLADA_DOM/src/dae/dae.cpp
ejcoumans a0f320764b Upgraded to latest COLLADA-DOM 1.2.0, see http://sourceforge.net/project/showfiles.php?group_id=157838
November 13, 2006
Re-applied the 'INF' fix for constraint limits.
2006-12-19 02:33:05 +00:00

386 lines
8.3 KiB
C++

/*
* Copyright 2006 Sony Computer Entertainment Inc.
*
* Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at:
* http://research.scea.com/scea_shared_source_license.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing permissions and limitations under the
* License.
*/
#include <dae.h>
#include <dae/daeDom.h>
#include <dae/daeIDRef.h>
#include <dae/daeMetaElement.h>
#include <modules/daeSTLDatabase.h>
#include <dae/daeErrorHandler.h>
#ifndef NO_DEFAULT_PLUGIN
#ifndef DEFAULT_BXCEPLUGIN
#include <modules/daeLIBXMLPlugin.h>
#include <modules/daeLIBXMLResolver.h>
#else
//This plugin is not provided with the public release. If you don't know about it then you don't need
//to worry about it.
#include <modules/daebXCePlugin.h>
#include <modules/daebXCeResolver.h>
#endif
#endif
// Don't include domConstants.h because it varies depending on the dom version,
// just extern the one thing we need (COLLADA_VERSION) which all versions of
// domConstants.h/.cpp are required to define.
extern daeString COLLADA_VERSION;
daeInt DAEInstanceCount = 0;
daeMetaElement *DAE::topMeta = NULL;
void
DAE::cleanup()
{
if (topMeta != NULL) {
daeMetaElement::releaseMetas();
daeAtomicType::uninitializeKnownTypes();
topMeta = NULL;
//Contributed by Nus - Wed, 08 Nov 2006
terminateURI();
terminateResolveArray();
daeStringRef::releaseStringTable();
daeIDRefResolver::terminateIDRefSolver();
//----------------------
}
}
// constructor
DAE::DAE() : database(NULL),
plugin(NULL),
resolver(NULL),
idResolver(NULL),
defaultDatabase(false),
defaultPlugin(false),
registerFunc(NULL)
{
//Contributed by Nus - Wed, 08 Nov 2006
initializeURI();
initializeResolveArray();
daeIDRefResolver::initializeIDRefSolver();
//------------------------
if ( DAEInstanceCount == 0 ) {
topMeta = initializeDomMeta();
}
DAEInstanceCount++;
}
DAE::~DAE()
{
if (defaultDatabase)
delete database;
if (defaultPlugin) {
delete plugin;
delete resolver;
delete idResolver;
}
daeElement::clearResolveArray();
--DAEInstanceCount;
if ( DAEInstanceCount <= 0 )
{
cleanup();
}
}
// Database setup
daeDatabase* DAE::getDatabase()
{
return database;
}
daeInt DAE::setDatabase(daeDatabase* _database)
{
if (defaultDatabase)
delete database;
if (_database)
database = _database;
else
{
//create default database
database = new daeSTLDatabase;
defaultDatabase = true;
}
// !!!GAC Not sure what good the error return is, current implementations never fail, what would we do if they did?
int res = database->setMeta(topMeta);
(void)res;
return DAE_OK;
}
// IO Plugin setup
daeIOPlugin* DAE::getIOPlugin()
{
return plugin;
}
daeInt DAE::setIOPlugin(daeIOPlugin* _plugin)
{
if (defaultPlugin)
delete plugin;
if (_plugin)
plugin = _plugin;
else
{
//create default plugin
#ifndef NO_DEFAULT_PLUGIN
#ifndef DEFAULT_BXCEPLUGIN
plugin = new daeLIBXMLPlugin;
defaultPlugin = true;
resolver = new daeLIBXMLResolver(database,plugin);
#else
plugin = new daebXCePlugin();
defaultPlugin = true;
resolver = new daebXCeResolver(database, plugin);
#endif
#else
daeErrorHandler::get()->handleWarning( "No IOPlugin Set! NO_DEFAULT_PLUGIN is defined." );
plugin = NULL;
return DAE_ERR_BACKEND_IO;
#endif
// Setup the IDRef resolver
idResolver = new daeDefaultIDRefResolver(database);
}
int res = plugin->setMeta(topMeta);
if (res != DAE_OK)
{
if (defaultPlugin)
{
defaultPlugin = false;
delete plugin;
}
plugin = NULL;
return res;
}
return DAE_OK;
}
// Integration Library Setup
daeIntegrationLibraryFunc DAE::getIntegrationLibrary()
{
return registerFunc;
}
daeInt DAE::setIntegrationLibrary(daeIntegrationLibraryFunc _registerFunc)
{
registerFunc = _registerFunc;
return DAE_OK;
}
// batch file operations
daeInt DAE::load(daeString name, daeString docBuffer)
{
if (!database)
setDatabase(NULL);
if (!plugin)
setIOPlugin(NULL);
if (registerFunc)
registerFunc();
if ( !plugin || !database ) {
//printf( "no plugin or database\n" );
daeErrorHandler::get()->handleError("no plugin or database\n");
return DAE_ERR_BACKEND_IO;
}
plugin->setDatabase(database);
if (!name || name[0] == '\0')
return DAE_ERR_INVALID_CALL;
daeURI tempURI(name);
return plugin->read(tempURI, docBuffer);
}
daeInt DAE::save(daeString documentName, daeBool replace)
{
if (!database)
setDatabase(NULL);
if (!plugin)
setIOPlugin(NULL);
if (registerFunc)
registerFunc();
if ( !plugin || !database ) {
return DAE_ERR_BACKEND_IO;
}
plugin->setDatabase(database);
// Find the document we want by name
daeDocument* document = database->getDocument(documentName);
if(document == NULL)
return DAE_ERR_COLLECTION_DOES_NOT_EXIST;
// Save it out to the URI it was loaded from
return plugin->write(document->getDocumentURI(), document, replace);
}
daeInt DAE::save(daeUInt documentIndex, daeBool replace)
{
if (!database)
setDatabase(NULL);
if (!plugin)
setIOPlugin(NULL);
if (registerFunc)
registerFunc();
if ( !plugin || !database ) {
return DAE_ERR_BACKEND_IO;
}
plugin->setDatabase(database);
if(documentIndex >= database->getDocumentCount())
return DAE_ERR_COLLECTION_DOES_NOT_EXIST;
daeDocument *document = database->getDocument(documentIndex);
// Save it out to the URI it was loaded from
return plugin->write(document->getDocumentURI(), document, replace);
}
daeInt DAE::saveAs(daeString name, daeString documentName, daeBool replace)
{
if (!database)
setDatabase(NULL);
if (!plugin)
setIOPlugin(NULL);
if (registerFunc)
registerFunc();
if ( !plugin || !database ) {
return DAE_ERR_BACKEND_IO;
}
plugin->setDatabase(database);
// Find the document we want by name
daeDocument* document = database->getDocument(documentName);
if(document == NULL)
return DAE_ERR_COLLECTION_DOES_NOT_EXIST;
// Make a URI from "name" and save to that
daeURI tempURI(name, true);
return plugin->write(&tempURI, document, replace);
}
daeInt DAE::saveAs(daeString name, daeUInt documentIndex, daeBool replace)
{
if (!database)
setDatabase(NULL);
if (!plugin)
setIOPlugin(NULL);
if (registerFunc)
registerFunc();
if ( !plugin || !database ) {
return DAE_ERR_BACKEND_IO;
}
plugin->setDatabase(database);
if(documentIndex >= database->getDocumentCount())
return DAE_ERR_COLLECTION_DOES_NOT_EXIST;
daeDocument *document = database->getDocument(documentIndex);
daeURI tempURI(name);
return plugin->write(&tempURI, document, replace);
}
daeInt DAE::unload(daeString name)
{
daeDocument *col = database->getDocument( name );
if ( col == NULL ) return DAE_ERR_COLLECTION_DOES_NOT_EXIST;
return database->removeDocument( col );
}
daeInt DAE::clear()
{
daeElement::clearResolveArray();
if (database)
database->clear();
return DAE_OK;
}
// Load/Save Progress
void DAE::getProgress(daeInt* bytesParsed,daeInt* lineNumber,daeInt* totalBytes,daeBool reset)
{
if (!database || !plugin)
{
if (bytesParsed)
*bytesParsed=0;
if (bytesParsed)
*lineNumber=0;
if (totalBytes)
*totalBytes=0;
}
else
plugin->getProgress(bytesParsed,lineNumber,totalBytes,reset);
}
// Simple Query
domCOLLADA* DAE::getDom(daeString name)
{
if (!database)
return NULL;
// Find the document by name
daeDocument *document = database->getDocument(name);
if(document)
{
// Return the root domCOLLADA element
return (domCOLLADA*)(daeElement*)document->getDomRoot();
}
else
{
return(NULL);
}
}
daeInt DAE::setDom(daeString name, domCOLLADA* dom)
{
if (!database)
setDatabase(NULL);
// Find the document by name
daeDocument *document = database->getDocument(name);
if(document)
{
//replace a DOM on an existing document by the one provided.
// Note that the casts are needed because we don't want to include the full definition of domCOLLADA
document->setDomRoot((daeElement*)dom);
return DAE_OK;
}
else
{
// Document doesn't exist, make a new one
return database->insertDocument(name,(daeElement*)dom);
}
}
daeString DAE::getDomVersion()
{
return(COLLADA_VERSION);
}