From c0b36a0be0474c5bd3a4859450d257099c8fe681 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Wed, 6 Oct 2010 16:23:52 +0000 Subject: [PATCH] COLLADA: Split ImagesExporter into separate files. --- source/blender/blenlib/BLI_fileops.h | 8 ++ source/blender/collada/DocumentExporter.cpp | 63 +------------- source/blender/collada/ImageExporter.cpp | 93 +++++++++++++++++++++ source/blender/collada/ImageExporter.h | 50 +++++++++++ 4 files changed, 152 insertions(+), 62 deletions(-) create mode 100644 source/blender/collada/ImageExporter.cpp create mode 100644 source/blender/collada/ImageExporter.h diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h index 6c98d30e4b1..b721a21b1b9 100644 --- a/source/blender/blenlib/BLI_fileops.h +++ b/source/blender/blenlib/BLI_fileops.h @@ -36,6 +36,10 @@ #ifndef BLI_FILEOPS_H #define BLI_FILEOPS_H +#ifdef __cplusplus +extern "C" { +#endif + void BLI_recurdir_fileops(char *dirname); int BLI_link(char *file, char *to); int BLI_is_writable(char *filename); @@ -60,5 +64,9 @@ char *first_slash(char *string); void BLI_setCmdCallBack(int (*f)(char*)); #endif +#ifdef __cplusplus +} +#endif + #endif diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp index 06df94416b3..9bf84c7e606 100644 --- a/source/blender/collada/DocumentExporter.cpp +++ b/source/blender/collada/DocumentExporter.cpp @@ -109,10 +109,10 @@ extern char build_rev[]; #include "ArmatureExporter.h" #include "CameraExporter.h" #include "GeometryExporter.h" +#include "ImageExporter.h" #include "LightExporter.h" #include "MaterialExporter.h" - #include #include // std::find @@ -299,67 +299,6 @@ public: } }; -class ImagesExporter: COLLADASW::LibraryImages -{ - const char *mfilename; - std::vector mImages; // contains list of written images, to avoid duplicates -public: - ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename) : COLLADASW::LibraryImages(sw), mfilename(filename) - {} - - void exportImages(Scene *sce) - { - openLibrary(); - MaterialFunctor mf; - mf.forEachMaterialInScene(sce, *this); - - closeLibrary(); - } - - void operator()(Material *ma, Object *ob) - { - int a; - for (a = 0; a < MAX_MTEX; a++) { - MTex *mtex = ma->mtex[a]; - if (mtex && mtex->tex && mtex->tex->ima) { - - Image *image = mtex->tex->ima; - std::string name(id_name(image)); - name = translate_id(name); - char rel[FILE_MAX]; - char abs[FILE_MAX]; - char src[FILE_MAX]; - char dir[FILE_MAX]; - - BLI_split_dirfile(mfilename, dir, NULL); - - BKE_rebase_path(abs, sizeof(abs), rel, sizeof(rel), G.sce, image->name, dir); - - if (abs[0] != '\0') { - - // make absolute source path - BLI_strncpy(src, image->name, sizeof(src)); - BLI_path_abs(src, G.sce); - - // make dest directory if it doesn't exist - BLI_make_existing_file(abs); - - if (BLI_copy_fileops(src, abs) != 0) { - fprintf(stderr, "Cannot copy image to file's directory. \n"); - } - } - - if (find(mImages.begin(), mImages.end(), name) == mImages.end()) { - COLLADASW::Image img(COLLADABU::URI(COLLADABU::URI::nativePathToUri(rel)), name); - img.add(mSW); - - mImages.push_back(name); - } - } - } - } -}; - class EffectsExporter: COLLADASW::LibraryEffects { public: diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp new file mode 100644 index 00000000000..3bcce313aa5 --- /dev/null +++ b/source/blender/collada/ImageExporter.cpp @@ -0,0 +1,93 @@ +/** + * $Id: DocumentExporter.cpp 32309 2010-10-05 00:05:14Z jesterking $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed, + * Nathan Letwory + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "COLLADABUURI.h" +#include "COLLADASWImage.h" + +#include "ImageExporter.h" +#include "MaterialExporter.h" + +#include "DNA_texture_types.h" + +#include "BKE_global.h" +#include "BKE_utildefines.h" +#include "BLI_fileops.h" +#include "BLI_path_util.h" +#include "BLI_string.h" + +ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename) : COLLADASW::LibraryImages(sw), mfilename(filename) +{} + +void ImagesExporter::exportImages(Scene *sce) +{ + openLibrary(); + MaterialFunctor mf; + mf.forEachMaterialInScene(sce, *this); + + closeLibrary(); +} + +void ImagesExporter::operator()(Material *ma, Object *ob) +{ + int a; + for (a = 0; a < MAX_MTEX; a++) { + MTex *mtex = ma->mtex[a]; + if (mtex && mtex->tex && mtex->tex->ima) { + + Image *image = mtex->tex->ima; + std::string name(id_name(image)); + name = translate_id(name); + char rel[FILE_MAX]; + char abs[FILE_MAX]; + char src[FILE_MAX]; + char dir[FILE_MAX]; + + BLI_split_dirfile(mfilename, dir, NULL); + + BKE_rebase_path(abs, sizeof(abs), rel, sizeof(rel), G.sce, image->name, dir); + + if (abs[0] != '\0') { + + // make absolute source path + BLI_strncpy(src, image->name, sizeof(src)); + BLI_path_abs(src, G.sce); + + // make dest directory if it doesn't exist + BLI_make_existing_file(abs); + + if (BLI_copy_fileops(src, abs) != 0) { + fprintf(stderr, "Cannot copy image to file's directory. \n"); + } + } + + if (find(mImages.begin(), mImages.end(), name) == mImages.end()) { + COLLADASW::Image img(COLLADABU::URI(COLLADABU::URI::nativePathToUri(rel)), name); + img.add(mSW); + + mImages.push_back(name); + } + } + } +} diff --git a/source/blender/collada/ImageExporter.h b/source/blender/collada/ImageExporter.h new file mode 100644 index 00000000000..4ee9aba2f6d --- /dev/null +++ b/source/blender/collada/ImageExporter.h @@ -0,0 +1,50 @@ +/** + * $Id: DocumentExporter.cpp 32309 2010-10-05 00:05:14Z jesterking $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed, + * Nathan Letwory + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef __IMAGEEXPORTER_H__ +#define __IMAGEEXPORTER_H__ + +#include +#include + +#include "COLLADASWStreamWriter.h" +#include "COLLADASWLibraryImages.h" + +#include "DNA_material_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" + +class ImagesExporter: COLLADASW::LibraryImages +{ + const char *mfilename; + std::vector mImages; // contains list of written images, to avoid duplicates +public: + ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename); + + void exportImages(Scene *sce); + void operator()(Material *ma, Object *ob); +}; + +#endif