24using used_writers = std::map<std::string, std::set<std::string>>;
26class TestHierarchyWriter :
public AbstractHierarchyWriter {
31 TestHierarchyWriter(
const std::string &writer_type, used_writers &writers_map)
36 void write(HierarchyContext &context)
override
38 const char *
id_name = context.object->id.name;
41 if (writers.find(context.export_path) != writers.end()) {
42 ADD_FAILURE() <<
"Unexpectedly found another " <<
writer_type <<
" writer for " <<
id_name
43 <<
" to export to " << context.export_path;
45 writers.insert(context.export_path);
97 BlendfileLoadingBaseTest::SetUp();
126 if (!blendfile_load(
"usd" SEP_STR "usd_hierarchy_export_test.blend")) {
132 iterator->iterate_and_write();
135 used_writers expected_transforms = {
136 {
"OBCamera", {
"/Camera"}},
137 {
"OBDupli1", {
"/Dupli1"}},
138 {
"OBDupli2", {
"/ParentOfDupli2/Dupli2"}},
140 {
"/Dupli1/GEO_Head-0/GEO_Ear_L-1",
141 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Ear_L",
142 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Ear_L-1"}},
144 {
"/Dupli1/GEO_Head-0/GEO_Ear_R-2",
145 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Ear_R",
146 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Ear_R-2"}},
148 {
"/Dupli1/GEO_Head-0",
149 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head",
150 "/ParentOfDupli2/Dupli2/GEO_Head-0"}},
152 {
"/Dupli1/GEO_Head-0/GEO_Nose-3",
153 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Nose",
154 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Nose-3"}},
155 {
"OBGround plane", {
"/Ground plane"}},
156 {
"OBOutsideDupliGrandParent", {
"/Ground plane/OutsideDupliGrandParent"}},
157 {
"OBOutsideDupliParent", {
"/Ground plane/OutsideDupliGrandParent/OutsideDupliParent"}},
158 {
"OBParentOfDupli2", {
"/ParentOfDupli2"}}};
159 EXPECT_EQ(expected_transforms, iterator->transform_writers);
161 used_writers expected_data = {
162 {
"OBCamera", {
"/Camera/Camera"}},
164 {
"/Dupli1/GEO_Head-0/GEO_Ear_L-1/Ear",
165 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Ear_L/Ear",
166 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Ear_L-1/Ear"}},
168 {
"/Dupli1/GEO_Head-0/GEO_Ear_R-2/Ear",
169 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Ear_R/Ear",
170 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Ear_R-2/Ear"}},
172 {
"/Dupli1/GEO_Head-0/Face",
173 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/Face",
174 "/ParentOfDupli2/Dupli2/GEO_Head-0/Face"}},
176 {
"/Dupli1/GEO_Head-0/GEO_Nose-3/Nose",
177 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Nose/Nose",
178 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Nose-3/Nose"}},
179 {
"OBGround plane", {
"/Ground plane/Plane"}},
180 {
"OBParentOfDupli2", {
"/ParentOfDupli2/Icosphere"}},
183 EXPECT_EQ(expected_data, iterator->data_writers);
186 EXPECT_EQ(0, iterator->hair_writers.size());
187 EXPECT_EQ(0, iterator->particle_writers.size());
191 iterator->transform_writers.clear();
192 iterator->data_writers.clear();
193 iterator->iterate_and_write();
194 EXPECT_EQ(expected_transforms, iterator->transform_writers);
195 EXPECT_EQ(expected_data, iterator->data_writers);
204 if (!blendfile_load(
"usd" SEP_STR "usd_hierarchy_export_test.blend")) {
211 used_writers expected_transforms = {
212 {
"OBCamera", {
"/Camera"}},
213 {
"OBDupli1", {
"/Dupli1"}},
214 {
"OBDupli2", {
"/ParentOfDupli2/Dupli2"}},
216 {
"/Dupli1/GEO_Head-0/GEO_Ear_L-1",
217 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Ear_L",
218 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Ear_L-1"}},
220 {
"/Dupli1/GEO_Head-0/GEO_Ear_R-2",
221 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Ear_R",
222 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Ear_R-2"}},
224 {
"/Dupli1/GEO_Head-0",
225 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head",
226 "/ParentOfDupli2/Dupli2/GEO_Head-0"}},
228 {
"/Dupli1/GEO_Head-0/GEO_Nose-3",
229 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Nose",
230 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Nose-3"}},
231 {
"OBGround plane", {
"/Ground plane"}},
232 {
"OBOutsideDupliGrandParent", {
"/Ground plane/OutsideDupliGrandParent"}},
233 {
"OBOutsideDupliParent", {
"/Ground plane/OutsideDupliGrandParent/OutsideDupliParent"}},
234 {
"OBParentOfDupli2", {
"/ParentOfDupli2"}}};
236 used_writers expected_data = {
237 {
"OBCamera", {
"/Camera/Camera"}},
239 {
"/Dupli1/GEO_Head-0/GEO_Ear_L-1/Ear",
240 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Ear_L/Ear",
241 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Ear_L-1/Ear"}},
243 {
"/Dupli1/GEO_Head-0/GEO_Ear_R-2/Ear",
244 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Ear_R/Ear",
245 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Ear_R-2/Ear"}},
247 {
"/Dupli1/GEO_Head-0/Face",
248 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/Face",
249 "/ParentOfDupli2/Dupli2/GEO_Head-0/Face"}},
251 {
"/Dupli1/GEO_Head-0/GEO_Nose-3/Nose",
252 "/Ground plane/OutsideDupliGrandParent/OutsideDupliParent/GEO_Head/GEO_Nose/Nose",
253 "/ParentOfDupli2/Dupli2/GEO_Head-0/GEO_Nose-3/Nose"}},
254 {
"OBGround plane", {
"/Ground plane/Plane"}},
255 {
"OBParentOfDupli2", {
"/ParentOfDupli2/Icosphere"}},
263 export_subset.
shapes =
false;
264 iterator->set_export_subset(export_subset);
266 iterator->iterate_and_write();
267 EXPECT_EQ(expected_transforms, iterator->transform_writers);
268 EXPECT_EQ(expected_data, iterator->data_writers);
271 iterator->transform_writers.clear();
272 iterator->data_writers.clear();
275 iterator->iterate_and_write();
276 EXPECT_EQ(expected_transforms, iterator->transform_writers);
277 EXPECT_EQ(0, iterator->data_writers.size());
280 iterator->transform_writers.clear();
281 iterator->data_writers.clear();
287 export_subset.
shapes =
true;
288 iterator->set_export_subset(export_subset);
290 iterator->iterate_and_write();
291 EXPECT_EQ(0, iterator->transform_writers.size());
292 EXPECT_EQ(expected_data, iterator->data_writers);
295 iterator->transform_writers.clear();
296 iterator->data_writers.clear();
302 export_subset.
shapes =
true;
303 iterator->set_export_subset(export_subset);
305 iterator->iterate_and_write();
306 EXPECT_EQ(expected_transforms, iterator->transform_writers);
307 EXPECT_EQ(expected_data, iterator->data_writers);
324 if (!blendfile_load(
"alembic" SEP_STR "visibility.blend")) {
330 iterator->iterate_and_write();
333 used_writers expected_transforms = {{
"OBInvisibleAnimatedCube", {
"/InvisibleAnimatedCube"}},
334 {
"OBInvisibleCube", {
"/InvisibleCube"}},
335 {
"OBVisibleCube", {
"/VisibleCube"}}};
336 EXPECT_EQ(expected_transforms, iterator->transform_writers);
338 used_writers expected_data = {{
"OBInvisibleAnimatedCube", {
"/InvisibleAnimatedCube/Cube"}},
339 {
"OBInvisibleCube", {
"/InvisibleCube/Cube"}},
340 {
"OBVisibleCube", {
"/VisibleCube/Cube"}}};
342 EXPECT_EQ(expected_data, iterator->data_writers);
345 EXPECT_EQ(0, iterator->hair_writers.size());
346 EXPECT_EQ(0, iterator->particle_writers.size());
void BKE_scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain)
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
external readfile function prototypes.
Depsgraph * DEG_graph_new(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluationMode mode)
void DEG_graph_build_for_all_objects(Depsgraph *graph)
Object is a sort of wrapper for general info.
used_writers & writers_map
struct Depsgraph * depsgraph
struct BlendFileData * bfile
void depsgraph_create(eEvaluationMode depsgraph_evaluation_mode) override
TestingHierarchyIterator * iterator
void release_writer(AbstractHierarchyWriter *writer) override
AbstractHierarchyWriter * create_transform_writer(const HierarchyContext *) override
used_writers transform_writers
~TestingHierarchyIterator() override
AbstractHierarchyWriter * create_hair_writer(const HierarchyContext *) override
AbstractHierarchyWriter * create_data_writer(const HierarchyContext *) override
TestingHierarchyIterator(Main *bmain, Depsgraph *depsgraph)
AbstractHierarchyWriter * create_particle_writer(const HierarchyContext *) override
used_writers particle_writers
used_writers hair_writers
used_writers data_writers
std::string id_name(void *id)
const Depsgraph * depsgraph
TEST_F(AbstractHierarchyIteratorTest, ExportHierarchyTest)
ViewLayer * cur_view_layer