Changeset View
Changeset View
Standalone View
Standalone View
source/blender/io/common/intern/abstract_hierarchy_iterator_test.cc
- This file was moved from tests/gtests/usd/abstract_hierarchy_iterator_test.cc.
| Show All 13 Lines | |||||
| * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
| * | * | ||||
| * The Original Code is Copyright (C) 2019 Blender Foundation. | * The Original Code is Copyright (C) 2019 Blender Foundation. | ||||
| * All rights reserved. | * All rights reserved. | ||||
| */ | */ | ||||
| #include "IO_abstract_hierarchy_iterator.h" | #include "IO_abstract_hierarchy_iterator.h" | ||||
| #include "blenloader/blendfile_loading_base_test.h" | #include "blenloader/blendfile_loading_base_test.h" | ||||
| extern "C" { | |||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| #include "DEG_depsgraph.h" | #include "DEG_depsgraph.h" | ||||
| #include "DNA_object_types.h" | #include "DNA_object_types.h" | ||||
| } | |||||
| #include <map> | #include <map> | ||||
| #include <set> | #include <set> | ||||
| namespace blender::io { | |||||
| namespace { | |||||
| /* Mapping from ID.name to set of export hierarchy path. Duplicated objects can be exported | /* Mapping from ID.name to set of export hierarchy path. Duplicated objects can be exported | ||||
| * multiple times with different export paths, hence the set. */ | * multiple times with different export paths, hence the set. */ | ||||
| typedef std::map<std::string, std::set<std::string>> used_writers; | typedef std::map<std::string, std::set<std::string>> used_writers; | ||||
| using namespace blender::io; | |||||
| class TestHierarchyWriter : public AbstractHierarchyWriter { | class TestHierarchyWriter : public AbstractHierarchyWriter { | ||||
| public: | public: | ||||
| std::string writer_type; | std::string writer_type; | ||||
| used_writers &writers_map; | used_writers &writers_map; | ||||
| TestHierarchyWriter(const std::string &writer_type, used_writers &writers_map) | TestHierarchyWriter(const std::string &writer_type, used_writers &writers_map) | ||||
| : writer_type(writer_type), writers_map(writers_map) | : writer_type(writer_type), writers_map(writers_map) | ||||
| { | { | ||||
| } | } | ||||
| void write(HierarchyContext &context) override | void write(HierarchyContext &context) override | ||||
| { | { | ||||
| const char *id_name = context.object->id.name; | const char *id_name = context.object->id.name; | ||||
| used_writers::mapped_type &writers = writers_map[id_name]; | used_writers::mapped_type &writers = writers_map[id_name]; | ||||
| if (writers.find(context.export_path) != writers.end()) { | if (writers.find(context.export_path) != writers.end()) { | ||||
| ADD_FAILURE() << "Unexpectedly found another " << writer_type << " writer for " << id_name | ADD_FAILURE() << "Unexpectedly found another " << writer_type << " writer for " << id_name | ||||
| << " to export to " << context.export_path; | << " to export to " << context.export_path; | ||||
| } | } | ||||
| writers.insert(context.export_path); | writers.insert(context.export_path); | ||||
| } | } | ||||
| }; | }; | ||||
| void debug_print_writers(const char *label, const used_writers &writers_map) | } // namespace | ||||
| { | |||||
| printf("%s:\n", label); | |||||
| for (auto idname_writers : writers_map) { | |||||
| printf(" %s:\n", idname_writers.first.c_str()); | |||||
| for (const std::string &export_path : idname_writers.second) { | |||||
| printf(" - %s\n", export_path.c_str()); | |||||
| } | |||||
| } | |||||
| } | |||||
| class TestingHierarchyIterator : public AbstractHierarchyIterator { | class TestingHierarchyIterator : public AbstractHierarchyIterator { | ||||
| public: /* Public so that the test cases can directly inspect the created writers. */ | public: /* Public so that the test cases can directly inspect the created writers. */ | ||||
| used_writers transform_writers; | used_writers transform_writers; | ||||
| used_writers data_writers; | used_writers data_writers; | ||||
| used_writers hair_writers; | used_writers hair_writers; | ||||
| used_writers particle_writers; | used_writers particle_writers; | ||||
| public: | public: | ||||
| explicit TestingHierarchyIterator(Depsgraph *depsgraph) : AbstractHierarchyIterator(depsgraph) | explicit TestingHierarchyIterator(Depsgraph *depsgraph) : AbstractHierarchyIterator(depsgraph) | ||||
| { | { | ||||
| } | } | ||||
| virtual ~TestingHierarchyIterator() | virtual ~TestingHierarchyIterator() | ||||
| { | { | ||||
| } | } | ||||
| protected: | protected: | ||||
| AbstractHierarchyWriter *create_transform_writer(const HierarchyContext *context) override | AbstractHierarchyWriter *create_transform_writer(const HierarchyContext * /*context*/) override | ||||
| { | { | ||||
| return new TestHierarchyWriter("transform", transform_writers); | return new TestHierarchyWriter("transform", transform_writers); | ||||
| } | } | ||||
| AbstractHierarchyWriter *create_data_writer(const HierarchyContext *context) override | AbstractHierarchyWriter *create_data_writer(const HierarchyContext * /*context*/) override | ||||
| { | { | ||||
| return new TestHierarchyWriter("data", data_writers); | return new TestHierarchyWriter("data", data_writers); | ||||
| } | } | ||||
| AbstractHierarchyWriter *create_hair_writer(const HierarchyContext *context) override | AbstractHierarchyWriter *create_hair_writer(const HierarchyContext * /*context*/) override | ||||
| { | { | ||||
| return new TestHierarchyWriter("hair", hair_writers); | return new TestHierarchyWriter("hair", hair_writers); | ||||
| } | } | ||||
| AbstractHierarchyWriter *create_particle_writer(const HierarchyContext *context) override | AbstractHierarchyWriter *create_particle_writer(const HierarchyContext * /*context*/) override | ||||
| { | { | ||||
| return new TestHierarchyWriter("particle", particle_writers); | return new TestHierarchyWriter("particle", particle_writers); | ||||
| } | } | ||||
| void delete_object_writer(AbstractHierarchyWriter *writer) override | void delete_object_writer(AbstractHierarchyWriter *writer) override | ||||
| { | { | ||||
| delete writer; | delete writer; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 212 Lines • ▼ Show 20 Lines | // Fourth iteration, should export everything now. | ||||
| export_subset.transforms = true; | export_subset.transforms = true; | ||||
| export_subset.shapes = true; | export_subset.shapes = true; | ||||
| iterator->set_export_subset(export_subset); | iterator->set_export_subset(export_subset); | ||||
| } | } | ||||
| iterator->iterate_and_write(); | iterator->iterate_and_write(); | ||||
| EXPECT_EQ(expected_transforms, iterator->transform_writers); | EXPECT_EQ(expected_transforms, iterator->transform_writers); | ||||
| EXPECT_EQ(expected_data, iterator->data_writers); | EXPECT_EQ(expected_data, iterator->data_writers); | ||||
| } | } | ||||
| } // namespace blender::io | |||||