Prepare archive structure.
parent
454b8919b0
commit
09a5946dbd
|
@ -57,9 +57,9 @@ void ExportScene3MF( const char* pFile, IOSystem* pIOSystem, const aiScene* pSce
|
||||||
throw DeadlyExportError( "Could not open output .3ds file: " + std::string( pFile ) );
|
throw DeadlyExportError( "Could not open output .3ds file: " + std::string( pFile ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
D3MF::D3MFExporter myExporter( outfile, pScene );
|
D3MF::D3MFExporter myExporter( outfile, pIOSystem, pScene );
|
||||||
if ( myExporter.validate() ) {
|
if ( myExporter.validate() ) {
|
||||||
bool ok = myExporter.exportArchive();
|
bool ok = myExporter.exportArchive(pFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,8 +67,9 @@ namespace D3MF {
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO3MF_EXPORTER
|
#ifndef ASSIMP_BUILD_NO3MF_EXPORTER
|
||||||
|
|
||||||
D3MFExporter::D3MFExporter( std::shared_ptr<IOStream> outfile, const aiScene* pScene )
|
D3MFExporter::D3MFExporter( std::shared_ptr<IOStream> outfile, IOSystem* pIOSystem, const aiScene* pScene )
|
||||||
: mStream( outfile.get() )
|
: mIOSystem( pIOSystem )
|
||||||
|
, mStream( outfile.get() )
|
||||||
, mScene( pScene )
|
, mScene( pScene )
|
||||||
, mBuildItems() {
|
, mBuildItems() {
|
||||||
// empty
|
// empty
|
||||||
|
@ -78,6 +79,26 @@ D3MFExporter::~D3MFExporter() {
|
||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool D3MFExporter::createFileStructure( const char *file ) {
|
||||||
|
if ( !mIOSystem->CreateDirectory( file ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !mIOSystem->ChangeDirectory( file ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !mIOSystem->CreateDirectory( "3D" ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !mIOSystem->CreateDirectory( "_rels" ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool D3MFExporter::validate() {
|
bool D3MFExporter::validate() {
|
||||||
if ( nullptr == mStream ) {
|
if ( nullptr == mStream ) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -90,8 +111,9 @@ bool D3MFExporter::validate() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool D3MFExporter::exportArchive() {
|
bool D3MFExporter::exportArchive( const char *file ) {
|
||||||
bool ok( true );
|
bool ok( true );
|
||||||
|
ok |= createFileStructure( file );
|
||||||
ok |= exportRelations();
|
ok |= exportRelations();
|
||||||
ok |= export3DModel();
|
ok |= export3DModel();
|
||||||
|
|
||||||
|
@ -102,7 +124,10 @@ bool D3MFExporter::exportRelations() {
|
||||||
mOutput.clear();
|
mOutput.clear();
|
||||||
|
|
||||||
mOutput << "<?xml version = \"1.0\" encoding = \"UTF-8\"?>\n";
|
mOutput << "<?xml version = \"1.0\" encoding = \"UTF-8\"?>\n";
|
||||||
mOutput
|
//mOutput
|
||||||
|
|
||||||
|
writeRelInfoToFile();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,6 +142,8 @@ bool D3MFExporter::export3DModel() {
|
||||||
|
|
||||||
writeObjects();
|
writeObjects();
|
||||||
|
|
||||||
|
writeModelToArchive();
|
||||||
|
|
||||||
mOutput << "</" << XmlTag::resources << ">\n";
|
mOutput << "</" << XmlTag::resources << ">\n";
|
||||||
writeBuild();
|
writeBuild();
|
||||||
|
|
||||||
|
@ -202,6 +229,9 @@ void D3MFExporter::writeBuild() {
|
||||||
mOutput << "</" << XmlTag::build << ">\n";
|
mOutput << "</" << XmlTag::build << ">\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool writeModelToArchive();
|
||||||
|
bool writeRelInfoToFile();
|
||||||
|
|
||||||
#endif // ASSIMP_BUILD_NO3MF_EXPORTER
|
#endif // ASSIMP_BUILD_NO3MF_EXPORTER
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,7 @@ struct aiMesh;
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
||||||
class IOStream;
|
class IOStream;
|
||||||
|
class IOSystem;
|
||||||
|
|
||||||
namespace D3MF {
|
namespace D3MF {
|
||||||
|
|
||||||
|
@ -60,10 +61,11 @@ namespace D3MF {
|
||||||
|
|
||||||
class D3MFExporter {
|
class D3MFExporter {
|
||||||
public:
|
public:
|
||||||
D3MFExporter( std::shared_ptr<IOStream> outfile, const aiScene* pScene );
|
D3MFExporter( std::shared_ptr<IOStream> outfile, IOSystem* pIOSystem, const aiScene* pScene );
|
||||||
~D3MFExporter();
|
~D3MFExporter();
|
||||||
bool validate();
|
bool validate();
|
||||||
bool exportArchive();
|
bool createFileStructure( const char *file );
|
||||||
|
bool exportArchive( const char *file );
|
||||||
bool exportRelations();
|
bool exportRelations();
|
||||||
bool export3DModel();
|
bool export3DModel();
|
||||||
|
|
||||||
|
@ -74,8 +76,11 @@ protected:
|
||||||
void writeVertex( const aiVector3D &pos );
|
void writeVertex( const aiVector3D &pos );
|
||||||
void writeFaces( aiMesh *mesh );
|
void writeFaces( aiMesh *mesh );
|
||||||
void writeBuild();
|
void writeBuild();
|
||||||
|
bool writeModelToArchive();
|
||||||
|
bool writeRelInfoToFile();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
IOSystem *mIOSystem;
|
||||||
IOStream *mStream;
|
IOStream *mStream;
|
||||||
const aiScene *mScene;
|
const aiScene *mScene;
|
||||||
std::ostringstream mOutput;
|
std::ostringstream mOutput;
|
||||||
|
|
|
@ -416,7 +416,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParseAttributes(XmlReader*) {
|
void ParseAttributes(XmlReader*) {
|
||||||
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParseChildNode(XmlReader* xmlReader) {
|
void ParseChildNode(XmlReader* xmlReader) {
|
||||||
|
|
|
@ -714,7 +714,7 @@ public:
|
||||||
if (floatValue) {
|
if (floatValue) {
|
||||||
return floatValue->value.size() == 1 ? floatValue->value.front() : 0;
|
return floatValue->value.size() == 1 ? floatValue->value.front() : 0;
|
||||||
}
|
}
|
||||||
return atof(attr->value->toString().c_str());
|
return static_cast<float>( atof( attr->value->toString().c_str() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual float getAttributeValueAsFloat(int idx) const /*override*/ {
|
virtual float getAttributeValueAsFloat(int idx) const /*override*/ {
|
||||||
|
@ -725,7 +725,7 @@ public:
|
||||||
if (floatValue) {
|
if (floatValue) {
|
||||||
return floatValue->value.size() == 1 ? floatValue->value.front() : 0;
|
return floatValue->value.size() == 1 ? floatValue->value.front() : 0;
|
||||||
}
|
}
|
||||||
return atof(attributes[idx].value->toString().c_str());
|
return static_cast<float>( atof( attributes[ idx ].value->toString().c_str() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const char* getNodeName() const /*override*/ {
|
virtual const char* getNodeName() const /*override*/ {
|
||||||
|
|
|
@ -56,9 +56,19 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# include <direct.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
# include <stdio.h>
|
||||||
|
#else
|
||||||
|
# include <sys/stat.h>
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
||||||
class IOStream;
|
class IOStream;
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -198,20 +208,35 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual bool PopDirectory();
|
virtual bool PopDirectory();
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** @brief CReates an new directory at the given path.
|
||||||
|
* @param path [in] The path to create.
|
||||||
|
* @return True, when a directory was created. False if the directory
|
||||||
|
* cannot be created.
|
||||||
|
*/
|
||||||
|
virtual bool CreateDirectory( const std::string &path );
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** @brief Will change the current directory to the given path.
|
||||||
|
* @param path [in] The path to change to.
|
||||||
|
* @return True, when the directory has changed successfully.
|
||||||
|
*/
|
||||||
|
virtual bool ChangeDirectory( const std::string &path );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<std::string> m_pathStack;
|
std::vector<std::string> m_pathStack;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
AI_FORCE_INLINE IOSystem::IOSystem() :
|
AI_FORCE_INLINE
|
||||||
m_pathStack()
|
IOSystem::IOSystem()
|
||||||
{
|
: m_pathStack() {
|
||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
AI_FORCE_INLINE IOSystem::~IOSystem()
|
AI_FORCE_INLINE
|
||||||
{
|
IOSystem::~IOSystem() {
|
||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,9 +247,8 @@ AI_FORCE_INLINE IOSystem::~IOSystem()
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
AI_FORCE_INLINE IOStream* IOSystem::Open(const std::string& pFile,
|
AI_FORCE_INLINE
|
||||||
const std::string& pMode)
|
IOStream* IOSystem::Open(const std::string& pFile, const std::string& pMode) {
|
||||||
{
|
|
||||||
// NOTE:
|
// NOTE:
|
||||||
// For compatibility, interface was changed to const char* to
|
// For compatibility, interface was changed to const char* to
|
||||||
// avoid crashes between binary incompatible STL versions
|
// avoid crashes between binary incompatible STL versions
|
||||||
|
@ -232,8 +256,8 @@ AI_FORCE_INLINE IOStream* IOSystem::Open(const std::string& pFile,
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
AI_FORCE_INLINE bool IOSystem::Exists( const std::string& pFile) const
|
AI_FORCE_INLINE
|
||||||
{
|
bool IOSystem::Exists( const std::string& pFile) const {
|
||||||
// NOTE:
|
// NOTE:
|
||||||
// For compatibility, interface was changed to const char* to
|
// For compatibility, interface was changed to const char* to
|
||||||
// avoid crashes between binary incompatible STL versions
|
// avoid crashes between binary incompatible STL versions
|
||||||
|
@ -241,9 +265,8 @@ AI_FORCE_INLINE bool IOSystem::Exists( const std::string& pFile) const
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
inline bool IOSystem::ComparePaths (const std::string& one,
|
AI_FORCE_INLINE
|
||||||
const std::string& second) const
|
bool IOSystem::ComparePaths (const std::string& one, const std::string& second) const {
|
||||||
{
|
|
||||||
// NOTE:
|
// NOTE:
|
||||||
// For compatibility, interface was changed to const char* to
|
// For compatibility, interface was changed to const char* to
|
||||||
// avoid crashes between binary incompatible STL versions
|
// avoid crashes between binary incompatible STL versions
|
||||||
|
@ -251,7 +274,8 @@ inline bool IOSystem::ComparePaths (const std::string& one,
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
inline bool IOSystem::PushDirectory( const std::string &path ) {
|
AI_FORCE_INLINE
|
||||||
|
bool IOSystem::PushDirectory( const std::string &path ) {
|
||||||
if ( path.empty() ) {
|
if ( path.empty() ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -262,7 +286,8 @@ inline bool IOSystem::PushDirectory( const std::string &path ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
inline const std::string &IOSystem::CurrentDirectory() const {
|
AI_FORCE_INLINE
|
||||||
|
const std::string &IOSystem::CurrentDirectory() const {
|
||||||
if ( m_pathStack.empty() ) {
|
if ( m_pathStack.empty() ) {
|
||||||
static const std::string Dummy("");
|
static const std::string Dummy("");
|
||||||
return Dummy;
|
return Dummy;
|
||||||
|
@ -271,12 +296,14 @@ inline const std::string &IOSystem::CurrentDirectory() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
inline size_t IOSystem::StackSize() const {
|
AI_FORCE_INLINE
|
||||||
|
size_t IOSystem::StackSize() const {
|
||||||
return m_pathStack.size();
|
return m_pathStack.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
inline bool IOSystem::PopDirectory() {
|
AI_FORCE_INLINE
|
||||||
|
bool IOSystem::PopDirectory() {
|
||||||
if ( m_pathStack.empty() ) {
|
if ( m_pathStack.empty() ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -287,6 +314,32 @@ inline bool IOSystem::PopDirectory() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
AI_FORCE_INLINE
|
||||||
|
bool IOSystem::CreateDirectory( const std::string &path ) {
|
||||||
|
if ( path.empty() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
return 0 != ::_mkdir( path.c_str() );
|
||||||
|
#else
|
||||||
|
return 0 != ::mkdir( path.c_str(), 0777 );
|
||||||
|
#endif // _WIN32
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
AI_FORCE_INLINE
|
||||||
|
bool IOSystem::ChangeDirectory( const std::string &path ) {
|
||||||
|
if ( path.empty() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
return 0 != ::_chdir( path.c_str() );
|
||||||
|
#else
|
||||||
|
return 0 != ::chdir( path.c_str() );
|
||||||
|
#endif // _WIN32
|
||||||
|
}
|
||||||
|
|
||||||
} //!ns Assimp
|
} //!ns Assimp
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue