Merging r46469 through r46494 from trunk into soc-2011-tomato
[blender.git] / source / blender / collada / MaterialExporter.cpp
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
19  *                 Nathan Letwory
20  *
21  * ***** END GPL LICENSE BLOCK *****
22  */
23
24 /** \file blender/collada/MaterialExporter.cpp
25  *  \ingroup collada
26  */
27
28
29
30 #include "MaterialExporter.h"
31 #include "COLLADABUUtils.h"
32 #include "collada_internal.h"
33
34 MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): COLLADASW::LibraryMaterials(sw), export_settings(export_settings) {}
35
36 void MaterialsExporter::exportMaterials(Scene *sce)
37 {
38         if (hasMaterials(sce)) {
39                 openLibrary();
40
41                 MaterialFunctor mf;
42                 mf.forEachMaterialInScene<MaterialsExporter>(sce, *this, this->export_settings->selected);
43
44                 closeLibrary();
45         }
46 }
47
48
49 bool MaterialsExporter::hasMaterials(Scene *sce)
50 {
51         Base *base = (Base *)sce->base.first;
52         
53         while (base) {
54                 Object *ob= base->object;
55                 int a;
56                 for (a = 0; a < ob->totcol; a++) {
57                         Material *ma = give_current_material(ob, a+1);
58
59                         // no material, but check all of the slots
60                         if (!ma) continue;
61
62                         return true;
63                 }
64                 base= base->next;
65         }
66         return false;
67 }
68
69 void MaterialsExporter::operator()(Material *ma, Object *ob)
70 {
71         std::string name(id_name(ma));
72
73         openMaterial(get_material_id(ma), get_material_id(ma));
74
75         std::string efid = translate_id(name) + "-effect";
76         addInstanceEffect(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, efid));
77
78         closeMaterial();
79 }