Alembic: simplified conditional statements
[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         return settings->is_sequence || !schema.isConstant();
121 }
122
123 /* ************************************************************************** */
124
125 struct DerivedMesh;
126
127 using Alembic::AbcCoreAbstract::chrono_t;
128
129 class AbcObjectReader {
130 protected:
131         std::string m_name;
132         std::string m_object_name;
133         std::string m_data_name;
134         Object *m_object;
135         Alembic::Abc::IObject m_iobject;
136
137         ImportSettings *m_settings;
138
139         chrono_t m_min_time;
140         chrono_t m_max_time;
141
142         /* Use reference counting since the same reader may be used by multiple
143          * modifiers and/or constraints. */
144         int m_refcount;
145
146 public:
147         explicit AbcObjectReader(const Alembic::Abc::IObject &object, ImportSettings &settings);
148
149         virtual ~AbcObjectReader();
150
151         const Alembic::Abc::IObject &iobject() const;
152
153         /**
154          * Returns the transform of this object. This can be the Alembic object
155          * itself (in case of an Empty) or it can be the parent Alembic object.
156          */
157         virtual Alembic::AbcGeom::IXform xform();
158
159         Object *object() const;
160         void object(Object *ob);
161
162         const std::string & name() const { return m_name; }
163         const std::string & object_name() const { return m_object_name; }
164         const std::string & data_name() const { return m_data_name; }
165
166         virtual bool valid() const = 0;
167
168         virtual void readObjectData(Main *bmain, float time) = 0;
169
170         virtual DerivedMesh *read_derivedmesh(DerivedMesh *dm, const float time, int read_flag, const char **err_str)
171         {
172                 (void)time;
173                 (void)read_flag;
174                 (void)err_str;
175                 return dm;
176         }
177
178         /** Reads the object matrix and sets up an object transform if animated. */
179         void setupObjectTransform(const float time);
180
181         void addCacheModifier();
182
183         chrono_t minTime() const;
184         chrono_t maxTime() const;
185
186         int refcount() const;
187         void incref();
188         void decref();
189
190         void read_matrix(float mat[4][4], const float time, const float scale, bool &is_constant);
191 };
192
193 Imath::M44d get_matrix(const Alembic::AbcGeom::IXformSchema &schema, const float time);
194
195 #endif  /* __ABC_OBJECT_H__ */