Fix T67075: make object.visible_get() and similar APIs more forgiving
[blender.git] / source / blender / collada / GeometryExporter.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup collada
19  */
20
21 #ifndef __GEOMETRYEXPORTER_H__
22 #define __GEOMETRYEXPORTER_H__
23
24 #include <string>
25 #include <vector>
26 #include <set>
27
28 #include "COLLADASWStreamWriter.h"
29 #include "COLLADASWLibraryGeometries.h"
30 #include "COLLADASWInputList.h"
31
32 #include "DNA_mesh_types.h"
33 #include "DNA_object_types.h"
34 #include "DNA_scene_types.h"
35 #include "DNA_key_types.h"
36
37 #include "ExportSettings.h"
38 #include "collada_utils.h"
39 #include "BlenderContext.h"
40 #include "BKE_key.h"
41
42 struct Depsgraph;
43
44 class Normal {
45  public:
46   float x;
47   float y;
48   float z;
49
50   friend bool operator<(const Normal &, const Normal &);
51 };
52
53 bool operator<(const Normal &, const Normal &);
54
55 /* TODO: optimize UV sets by making indexed list with duplicates removed */
56 class GeometryExporter : COLLADASW::LibraryGeometries {
57   struct Face {
58     unsigned int v1, v2, v3, v4;
59   };
60
61   Normal n;
62
63  public:
64   /* TODO: optimize UV sets by making indexed list with duplicates removed */
65   GeometryExporter(BlenderContext &blender_context,
66                    COLLADASW::StreamWriter *sw,
67                    BCExportSettings &export_settings)
68       : COLLADASW::LibraryGeometries(sw),
69         blender_context(blender_context),
70         export_settings(export_settings)
71   {
72   }
73
74   void exportGeom();
75
76   void operator()(Object *ob);
77
78   void createLooseEdgeList(Object *ob, Mesh *me, std::string &geom_id);
79
80   /* powerful because it handles both cases when there is material and when there's not */
81   void create_mesh_primitive_list(short material_index,
82                                   bool has_uvs,
83                                   bool has_color,
84                                   Object *ob,
85                                   Mesh *me,
86                                   std::string &geom_id,
87                                   std::vector<BCPolygonNormalsIndices> &norind);
88
89   /* creates <source> for positions */
90   void createVertsSource(std::string geom_id, Mesh *me);
91
92   void createVertexColorSource(std::string geom_id, Mesh *me);
93
94   std::string makeTexcoordSourceId(std::string &geom_id, int layer_index, bool is_single_layer);
95
96   /* creates <source> for texcoords */
97   void createTexcoordsSource(std::string geom_id, Mesh *me);
98   void createTesselatedTexcoordsSource(std::string geom_id, Mesh *me);
99
100   /* creates <source> for normals */
101   void createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal> &nor);
102
103   void create_normals(std::vector<Normal> &nor,
104                       std::vector<BCPolygonNormalsIndices> &ind,
105                       Mesh *me);
106
107   std::string getIdBySemantics(std::string geom_id,
108                                COLLADASW::InputSemantic::Semantics type,
109                                std::string other_suffix = "");
110   std::string makeVertexColorSourceId(std::string &geom_id, char *layer_name);
111
112   COLLADASW::URI getUrlBySemantics(std::string geom_id,
113                                    COLLADASW::InputSemantic::Semantics type,
114                                    std::string other_suffix = "");
115
116   COLLADASW::URI makeUrl(std::string id);
117
118   void export_key_mesh(Object *ob, Mesh *me, KeyBlock *kb);
119
120  private:
121   std::set<std::string> exportedGeometry;
122   BlenderContext &blender_context;
123   BCExportSettings &export_settings;
124
125   Mesh *get_mesh(Scene *sce, Object *ob, int apply_modifiers);
126 };
127
128 struct GeometryFunctor {
129   /* f should have
130    * void operator()(Object *ob) */
131   template<class Functor>
132   void forEachMeshObjectInExportSet(Scene *sce, Functor &f, LinkNode *export_set)
133   {
134     LinkNode *node;
135     for (node = export_set; node; node = node->next) {
136       Object *ob = (Object *)node->link;
137       if (ob->type == OB_MESH) {
138         f(ob);
139       }
140     }
141   }
142 };
143
144 #endif