Merge branch 'master' into blender2.8
[blender.git] / source / blender / alembic / intern / abc_object.h
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): Esteban Tovagliari, Cedric Paille, Kevin Dietrich
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 #ifndef __ABC_OBJECT_H__
24 #define __ABC_OBJECT_H__
25
26 #include <Alembic/Abc/All.h>
27 #include <Alembic/AbcGeom/All.h>
28
29 #include "abc_exporter.h"
30
31 extern "C" {
32 #include "DNA_ID.h"
33 }
34
35 class AbcTransformWriter;
36
37 struct Main;
38 struct Object;
39
40 /* ************************************************************************** */
41
42 class AbcObjectWriter {
43 protected:
44         Object *m_object;
45         ExportSettings &m_settings;
46
47         uint32_t m_time_sampling;
48
49         Imath::Box3d m_bounds;
50         std::vector<AbcObjectWriter *> m_children;
51
52         std::vector< std::pair<std::string, IDProperty *> > m_props;
53
54         bool m_first_frame;
55         std::string m_name;
56
57 public:
58         AbcObjectWriter(Object *ob,
59                         uint32_t time_sampling,
60                         ExportSettings &settings,
61                         AbcObjectWriter *parent = NULL);
62
63         virtual ~AbcObjectWriter();
64
65         void addChild(AbcObjectWriter *child);
66
67         virtual Imath::Box3d bounds();
68
69         void write();
70
71 private:
72         virtual void do_write() = 0;
73 };
74
75 /* ************************************************************************** */
76
77 struct CacheFile;
78
79 struct ImportSettings {
80         bool do_convert_mat;
81         float conversion_mat[4][4];
82
83         int from_up;
84         int from_forward;
85         float scale;
86         bool is_sequence;
87         bool set_frame_range;
88
89         /* Length and frame offset of file sequences. */
90         int sequence_len;
91         int sequence_offset;
92
93         /* From MeshSeqCacheModifierData.read_flag */
94         int read_flag;
95
96         bool validate_meshes;
97
98         CacheFile *cache_file;
99
100         ImportSettings()
101             : do_convert_mat(false)
102             , from_up(0)
103             , from_forward(0)
104             , scale(1.0f)
105             , is_sequence(false)
106             , set_frame_range(false)
107             , sequence_len(1)
108             , sequence_offset(0)
109             , read_flag(0)
110             , validate_meshes(false)
111             , cache_file(NULL)
112         {}
113 };
114
115 template <typename Schema>
116 static bool has_animations(Schema &schema, ImportSettings *settings)
117 {
118         return settings->is_sequence || !schema.isConstant();
119 }
120
121 /* ************************************************************************** */
122
123 struct Mesh;
124
125 using Alembic::AbcCoreAbstract::chrono_t;
126
127 class AbcObjectReader {
128 protected:
129         std::string m_name;
130         std::string m_object_name;
131         std::string m_data_name;
132         Object *m_object;
133         Alembic::Abc::IObject m_iobject;
134
135         ImportSettings *m_settings;
136
137         chrono_t m_min_time;
138         chrono_t m_max_time;
139
140         /* Use reference counting since the same reader may be used by multiple
141          * modifiers and/or constraints. */
142         int m_refcount;
143
144         bool m_inherits_xform;
145
146 public:
147         AbcObjectReader *parent_reader;
148
149 public:
150         explicit AbcObjectReader(const Alembic::Abc::IObject &object, ImportSettings &settings);
151
152         virtual ~AbcObjectReader();
153
154         const Alembic::Abc::IObject &iobject() const;
155
156         typedef std::vector<AbcObjectReader *> ptr_vector;
157
158         /**
159          * Returns the transform of this object. This can be the Alembic object
160          * itself (in case of an Empty) or it can be the parent Alembic object.
161          */
162         virtual Alembic::AbcGeom::IXform xform();
163
164         Object *object() const;
165         void object(Object *ob);
166
167         const std::string & name() const { return m_name; }
168         const std::string & object_name() const { return m_object_name; }
169         const std::string & data_name() const { return m_data_name; }
170         bool inherits_xform() const { return m_inherits_xform; }
171
172         virtual bool valid() const = 0;
173         virtual bool accepts_object_type(const Alembic::AbcCoreAbstract::ObjectHeader &alembic_header,
174                                          const Object *const ob,
175                                          const char **err_str) const = 0;
176
177         virtual void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) = 0;
178
179         virtual struct Mesh *read_mesh(struct Mesh *mesh,
180                                        const Alembic::Abc::ISampleSelector &sample_sel,
181                                        int read_flag,
182                                        const char **err_str);
183
184         /** Reads the object matrix and sets up an object transform if animated. */
185         void setupObjectTransform(const float time);
186
187         void addCacheModifier();
188
189         chrono_t minTime() const;
190         chrono_t maxTime() const;
191
192         int refcount() const;
193         void incref();
194         void decref();
195
196         void read_matrix(float r_mat[4][4], const float time,
197                          const float scale, bool &is_constant);
198
199 protected:
200         void determine_inherits_xform();
201 };
202
203 Imath::M44d get_matrix(const Alembic::AbcGeom::IXformSchema &schema, const float time);
204
205 #endif  /* __ABC_OBJECT_H__ */