228 lines
8.8 KiB
C
228 lines
8.8 KiB
C
|
/*
|
||
|
* Copyright 2006 Sony Computer Entertainment Inc.
|
||
|
*
|
||
|
* Licensed under the MIT Open Source License, for details please see license.txt or the website
|
||
|
* http://www.opensource.org/licenses/mit-license.php
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef __DAE__
|
||
|
#define __DAE__
|
||
|
|
||
|
// We use the boost filesystem library for cross-platform file system support. You'll need
|
||
|
// to have boost on your machine for this to work. For the Windows build boost is provided
|
||
|
// in the external-libs folder, but for Linux it's expected that you'll install a boost
|
||
|
// obtained via your distro's package manager. For example on Debian/Ubuntu, you can run
|
||
|
// apt-get install libboost-filesystem-dev
|
||
|
// to install the boost filesystem library on your machine.
|
||
|
//
|
||
|
// Disable the warnings we get from Boost
|
||
|
// warning C4180: qualifier applied to function type has no meaning; ignored
|
||
|
// warning C4245: 'argument' : conversion from 'int' to 'boost::filesystem::system_error_type',
|
||
|
// signed/unsigned mismatch
|
||
|
#ifdef _MSC_VER
|
||
|
#pragma warning(push)
|
||
|
#pragma warning(disable: 4180 4245)
|
||
|
#endif
|
||
|
#ifndef NO_BOOST
|
||
|
#include <boost/filesystem/convenience.hpp>
|
||
|
#endif
|
||
|
#ifdef _MSC_VER
|
||
|
#pragma warning(pop)
|
||
|
#endif
|
||
|
|
||
|
#include <dae/daeTypes.h>
|
||
|
#include <dae/daeError.h>
|
||
|
#include <dae/daeDatabase.h>
|
||
|
#include <dae/daeIOPlugin.h>
|
||
|
#include <dae/daeAtomicType.h>
|
||
|
#include <dae/daeMetaElement.h>
|
||
|
#include <dae/daeIDRef.h>
|
||
|
#include <dae/daeURI.h>
|
||
|
#include <dae/daeUtils.h>
|
||
|
#include <dae/daeRawResolver.h>
|
||
|
#include <dae/daeSIDResolver.h>
|
||
|
|
||
|
class domCOLLADA;
|
||
|
typedef daeSmartRef<domCOLLADA> domCOLLADARef;
|
||
|
class daeDatabase;
|
||
|
|
||
|
// The DAE class is the core interface via which you interact with the DOM. It
|
||
|
// has methods to load/save documents, get the root element of each document,
|
||
|
// etc. Although internally the DOM works exclusively with URIs, the methods of
|
||
|
// the DAE class that take document paths can take URIs or OS-specific file
|
||
|
// paths.
|
||
|
class DLLSPEC DAE
|
||
|
{
|
||
|
public:
|
||
|
// Constructor. If no database or IO plugin are provided, a default database and
|
||
|
// IO plugin will be used.
|
||
|
DAE(daeDatabase* database = NULL, daeIOPlugin* ioPlugin = NULL)
|
||
|
: atomicTypes(*this),
|
||
|
baseUri(*this, cdom::getCurrentDirAsUri().c_str())
|
||
|
{
|
||
|
// See the end of the thread linked below for an explanation of why we have the DAE
|
||
|
// constructor set up this way. Basically, I'm going to be changing the build output
|
||
|
// location, and when this happens people sometimes continue to link against the old
|
||
|
// libraries by accident (e.g. if they just do an svn update). By introducing a new
|
||
|
// function that gets called from a function in a header file, I'm ensuring that someone
|
||
|
// who tries linking against old libraries will get a link error. This may not sound
|
||
|
// very nice, but it's certainly better than getting bizarre runtime crashes.
|
||
|
// https://collada.org/public_forum/viewtopic.php?t=771&sid=f13c34f2d17ca720c5021bccbe5128b7
|
||
|
init(database, ioPlugin);
|
||
|
dummyFunction1();
|
||
|
}
|
||
|
|
||
|
virtual ~DAE();
|
||
|
|
||
|
// Release all memory used by the DOM. You never need to call this explicitly. It's
|
||
|
// called automatically when all DAE objects go out of scope.
|
||
|
// Deletes directory returned by cdom::getSafeTmpDir().
|
||
|
static void cleanup();
|
||
|
|
||
|
public:
|
||
|
// Database setup
|
||
|
virtual daeDatabase* getDatabase();
|
||
|
virtual daeInt setDatabase(daeDatabase* database);
|
||
|
|
||
|
// IO Plugin setup
|
||
|
virtual daeIOPlugin* getIOPlugin();
|
||
|
virtual daeInt setIOPlugin(daeIOPlugin* plugin);
|
||
|
|
||
|
// Creates a new document, returning null on failure.
|
||
|
virtual domCOLLADA* add(const std::string& path);
|
||
|
// Opens an existing document, returning null on failure.
|
||
|
virtual domCOLLADA* open(const std::string& path);
|
||
|
// Opens a document from memory, returning null on failure.
|
||
|
virtual domCOLLADA* openFromMemory(const std::string& path, daeString buffer);
|
||
|
// Write a document to the path specified by the document's URI, returning false on failure.
|
||
|
virtual bool write(const std::string& path);
|
||
|
// Write a document to the path specified in the second parameter, returning false on failure.
|
||
|
virtual bool writeTo(const std::string& docPath, const std::string& pathToWriteTo);
|
||
|
// Writes all documents, returning false if any document failed to write.
|
||
|
virtual bool writeAll();
|
||
|
// Close a specific document, unloading all memory used by the document. Returns false on failure.
|
||
|
virtual void close(const std::string& path);
|
||
|
// Remove all loaded documents. Always returns DAE_OK.
|
||
|
virtual daeInt clear();
|
||
|
|
||
|
// Returns the total number of documents.
|
||
|
virtual int getDocCount();
|
||
|
// Returns the i'th document .
|
||
|
virtual daeDocument* getDoc(int i);
|
||
|
// Returns a document matching the path.
|
||
|
virtual daeDocument* getDoc(const std::string& path);
|
||
|
|
||
|
// Get the root domCOLLADA object corresponding to a particular document.
|
||
|
virtual domCOLLADA* getRoot(const std::string& path);
|
||
|
// Set the root domCOLLADA object corresponding to a particular document, returning false on failure.
|
||
|
virtual bool setRoot(const std::string& path, domCOLLADA* root);
|
||
|
|
||
|
// Returns the Collada version, i.e. 1.4, 1.5, etc. Note that this _isn't_ the
|
||
|
// same as the DOM version (1.3, 2.0, ...).
|
||
|
virtual daeString getDomVersion();
|
||
|
|
||
|
// Returns the (modifiable) list of atomic type objects.
|
||
|
daeAtomicTypeList& getAtomicTypes();
|
||
|
|
||
|
// Get/set a daeMetaElement object given the meta object's type ID.
|
||
|
daeMetaElement* getMeta(daeInt typeID);
|
||
|
void setMeta(daeInt typeID, daeMetaElement& meta);
|
||
|
|
||
|
// Get all daeMetaElement objects.
|
||
|
daeMetaElementRefArray& getAllMetas();
|
||
|
|
||
|
// Returns the list of URI resolvers. You can modify the list to add new resolvers.
|
||
|
daeURIResolverList& getURIResolvers();
|
||
|
|
||
|
// The base URI used for resolving relative URI references.
|
||
|
daeURI& getBaseURI();
|
||
|
void setBaseURI(const daeURI& uri);
|
||
|
void setBaseURI(const std::string& uri);
|
||
|
|
||
|
// Returns the list of ID reference resolvers. You can modify the list to add new
|
||
|
// resolvers.
|
||
|
daeIDRefResolverList& getIDRefResolvers();
|
||
|
|
||
|
// Meant for internal DOM use only.
|
||
|
daeRawRefCache& getRawRefCache();
|
||
|
daeSidRefCache& getSidRefCache();
|
||
|
|
||
|
// These functions specify the client's character encoding for the DOM. The
|
||
|
// default is Utf8, but if you specify Latin1 then the DOM will use libxml's
|
||
|
// character conversion functions to convert to Utf8 when writing data and
|
||
|
// convert to Latin1 when reading data. This can help with the handling of
|
||
|
// non-ASCII characters on Windows. Only when using libxml for xml I/O does
|
||
|
// any character conversion occur.
|
||
|
//
|
||
|
// Most people can probably just ignore this completely. If you have trouble
|
||
|
// with non-ASCII characters on Windows, try setting the char encoding to
|
||
|
// Latin1 to see if that helps.
|
||
|
//
|
||
|
// Frankly this certainly isn't the best way of handling non-ASCII character
|
||
|
// support on Windows, so this interface is a likely target for significant
|
||
|
// changes in the future.
|
||
|
//
|
||
|
// See this Sourceforge thread for more info:
|
||
|
// http://sourceforge.net/tracker/index.php?func=detail&aid=1818473&group_id=157838&atid=805426
|
||
|
//
|
||
|
enum charEncoding {
|
||
|
Utf8,
|
||
|
Latin1
|
||
|
};
|
||
|
|
||
|
// Global encoding setting. Defaults to Utf8. Set this if you want to make a
|
||
|
// char encoding change and apply it to all DAE objects.
|
||
|
static charEncoding getGlobalCharEncoding();
|
||
|
static void setGlobalCharEncoding(charEncoding encoding);
|
||
|
|
||
|
// Local encoding setting. If set, overrides the global setting. Useful for setting
|
||
|
// a specific char encoding for a single DAE object but not for all DAE objects.
|
||
|
charEncoding getCharEncoding();
|
||
|
void setCharEncoding(charEncoding encoding);
|
||
|
|
||
|
// Deprecated. Alternative methods are given.
|
||
|
virtual daeInt load(daeString uri, daeString docBuffer = NULL); // Use open
|
||
|
virtual daeInt save(daeString uri, daeBool replace=true); // Use write
|
||
|
virtual daeInt save(daeUInt documentIndex, daeBool replace=true); // Use write
|
||
|
virtual daeInt saveAs(daeString uriToSaveTo, daeString docUri, daeBool replace=true); // Use writeTo
|
||
|
virtual daeInt saveAs(daeString uriToSaveTo, daeUInt documentIndex=0, daeBool replace=true); // Use writeTo
|
||
|
virtual daeInt unload(daeString uri); // Use close
|
||
|
virtual domCOLLADA* getDom(daeString uri); // use getRoot
|
||
|
virtual daeInt setDom(daeString uri, domCOLLADA* dom); // use setRoot
|
||
|
|
||
|
private:
|
||
|
void init(daeDatabase* database, daeIOPlugin* ioPlugin);
|
||
|
void dummyFunction1();
|
||
|
std::string makeFullUri(const std::string& path);
|
||
|
domCOLLADA* openCommon(const std::string& path, daeString buffer);
|
||
|
bool writeCommon(const std::string& docPath, const std::string& pathToWriteTo, bool replace);
|
||
|
|
||
|
daeDatabase *database;
|
||
|
daeIOPlugin *plugin;
|
||
|
bool defaultDatabase;
|
||
|
bool defaultPlugin;
|
||
|
daeAtomicTypeList atomicTypes;
|
||
|
daeMetaElementRefArray metas;
|
||
|
daeURI baseUri;
|
||
|
daeURIResolverList uriResolvers;
|
||
|
daeIDRefResolverList idRefResolvers;
|
||
|
daeRawRefCache rawRefCache;
|
||
|
daeSidRefCache sidRefCache;
|
||
|
|
||
|
std::auto_ptr<charEncoding> localCharEncoding;
|
||
|
static charEncoding globalCharEncoding;
|
||
|
};
|
||
|
|
||
|
|
||
|
template <typename T>
|
||
|
inline T *daeSafeCast(daeElement *element)
|
||
|
{
|
||
|
if (element && element->typeID() == T::ID())
|
||
|
return (T*)element;
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif // __DAE_INTERFACE__
|