6d97c0359b7365231aa1d2c913c30017cf9daced
[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         Scene *m_scene;
48         uint32_t m_time_sampling;
49
50         Imath::Box3d m_bounds;
51         std::vector<AbcObjectWriter *> m_children;
52
53         std::vector< std::pair<std::string, IDProperty *> > m_props;
54
55         bool m_first_frame;
56         std::string m_name;
57
58 public:
59         AbcObjectWriter(Scene *scene,
60                         Object *ob,
61                         uint32_t time_sampling,
62                         ExportSettings &settings,
63                         AbcObjectWriter *parent = NULL);
64
65         virtual ~AbcObjectWriter();
66
67         void addChild(AbcObjectWriter *child);
68
69         virtual Imath::Box3d bounds();
70
71         void write();
72
73 private:
74         virtual void do_write() = 0;
75 };
76
77 /* ************************************************************************** */
78
79 struct CacheFile;
80
81 struct ImportSettings {
82         bool do_convert_mat;
83         float conversion_mat[4][4];
84
85         int from_up;
86         int from_forward;
87         float scale;
88         bool is_sequence;
89         bool set_frame_range;
90
91         /* Length and frame offset of file sequences. */
92         int sequence_len;
93         int offset;
94
95         /* From MeshSeqCacheModifierData.read_flag */
96         int read_flag;
97
98         bool validate_meshes;
99
100         CacheFile *cache_file;
101
102         ImportSettings()
103             : do_convert_mat(false)
104             , from_up(0)
105             , from_forward(0)
106             , scale(1.0f)
107             , is_sequence(false)
108             , set_frame_range(false)
109             , sequence_len(1)
110             , offset(0)
111             , read_flag(0)
112             , validate_meshes(false)
113             , cache_file(NULL)
114         {}
115 };
116
117 template <typename Schema>
118 static bool has_animations(Schema &schema, ImportSettings *settings)
119 {
120         if (settings->is_sequence) {
121                 return true;
122         }
123
124         if (!schema.isConstant()) {
125                 return true;
126         }
127
128         return false;
129 }
130
131 /* ************************************************************************** */
132
133 struct DerivedMesh;
134
135 using Alembic::AbcCoreAbstract::chrono_t;
136
137 class AbcObjectReader {
138 protected:
139         std::string m_name;
140         std::string m_object_name;
141         std::string m_data_name;
142         Object *m_object;
143         Alembic::Abc::IObject m_iobject;
144
145         ImportSettings *m_settings;
146
147         chrono_t m_min_time;
148         chrono_t m_max_time;
149
150         /* Use reference counting since the same reader may be used by multiple
151          * modifiers and/or constraints. */
152         int m_refcount;
153
154 public:
155         explicit AbcObjectReader(const Alembic::Abc::IObject &object, ImportSettings &settings);
156
157         virtual ~AbcObjectReader();
158
159         const Alembic::Abc::IObject &iobject() const;
160
161         /**
162          * Returns the transform of this object. This can be the Alembic object
163          * itself (in case of an Empty) or it can be the parent Alembic object.
164          */
165         virtual Alembic::AbcGeom::IXform xform();
166
167         Object *object() const;
168         void object(Object *ob);
169
170         const std::string & name() const { return m_name; }
171         const std::string & object_name() const { return m_object_name; }
172         const std::string & data_name() const { return m_data_name; }
173
174         virtual bool valid() const = 0;
175
176         virtual void readObjectData(Main *bmain, float time) = 0;
177
178         virtual DerivedMesh *read_derivedmesh(DerivedMesh *dm, const float time, int read_flag, const char **err_str)
179         {
180                 (void)time;
181                 (void)read_flag;
182                 (void)err_str;
183                 return dm;
184         }
185
186         void readObjectMatrix(const float time);
187
188         void addCacheModifier();
189
190         chrono_t minTime() const;
191         chrono_t maxTime() const;
192
193         int refcount() const;
194         void incref();
195         void decref();
196
197         void read_matrix(float mat[4][4], const float time, const float scale, bool &is_constant);
198 };
199
200 Imath::M44d get_matrix(const Alembic::AbcGeom::IXformSchema &schema, const float time);
201
202 #endif  /* __ABC_OBJECT_H__ */