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