diff options
Diffstat (limited to 'source/blender/io/alembic/exporter/abc_writer_abstract.h')
-rw-r--r-- | source/blender/io/alembic/exporter/abc_writer_abstract.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/source/blender/io/alembic/exporter/abc_writer_abstract.h b/source/blender/io/alembic/exporter/abc_writer_abstract.h index 59c55330443..d23e69cf73e 100644 --- a/source/blender/io/alembic/exporter/abc_writer_abstract.h +++ b/source/blender/io/alembic/exporter/abc_writer_abstract.h @@ -19,6 +19,7 @@ #pragma once #include "IO_abstract_hierarchy_iterator.h" +#include "abc_custom_props.h" #include "abc_hierarchy_iterator.h" #include <Alembic/Abc/OObject.h> @@ -27,6 +28,7 @@ #include "DEG_depsgraph_query.h" #include "DNA_material_types.h" +struct IDProperty; struct Material; struct Object; @@ -44,6 +46,9 @@ class ABCAbstractWriter : public AbstractHierarchyWriter { /* Visibility of this writer's data in Alembic. */ Alembic::Abc::OCharProperty abc_visibility_; + /* Optional writer for custom properties. */ + std::unique_ptr<CustomPropertiesExporter> custom_props_; + public: explicit ABCAbstractWriter(const ABCWriterConstructorArgs &args); virtual ~ABCAbstractWriter(); @@ -59,6 +64,7 @@ class ABCAbstractWriter : public AbstractHierarchyWriter { * Empty). */ virtual bool is_supported(const HierarchyContext *context) const; + uint32_t timesample_index() const; const Imath::Box3d &bounding_box() const; /* Called by AlembicHierarchyCreator after checking that the data is supported via @@ -67,12 +73,47 @@ class ABCAbstractWriter : public AbstractHierarchyWriter { virtual Alembic::Abc::OObject get_alembic_object() const = 0; + /* Return the Alembic object's CompoundProperty that'll contain the custom properties. + * + * This function is called whenever there are custom properties to be written to Alembic. It + * should call abc_schema_prop_for_custom_props() with the writer's Alembic schema object. + * + * If custom properties are not supported by a specific subclass, it should return an empty + * OCompoundProperty() and override ensure_custom_properties_exporter() to do nothing. + */ + virtual Alembic::Abc::OCompoundProperty abc_prop_for_custom_props() = 0; + protected: virtual void do_write(HierarchyContext &context) = 0; virtual void update_bounding_box(Object *object); + /* Return ID properties of whatever ID datablock is written by this writer. Defaults to the + * properties of the object data. Can return nullptr if no custom properties are to be written. + */ + virtual const IDProperty *get_id_properties(const HierarchyContext &context) const; + + virtual void ensure_custom_properties_exporter(const HierarchyContext &context); + void write_visibility(const HierarchyContext &context); + + /* Return the Alembic schema's compound property, which will be used for writing custom + * properties. + * + * This can return either abc_schema.getUserProperties() or abc_schema.getArbGeomParams(). The + * former only holds values similar to Blender's custom properties, whereas the latter can also + * specify that certain custom properties vary per mesh component (so per face, vertex, etc.). As + * such, .userProperties is more suitable for custom properties. However, Maya, Houdini use + * .arbGeomParams for custom data. + * + * Because of this, the code uses this templated function so that there is one place that + * determines where custom properties are exporter to. + */ + template<typename T> + Alembic::Abc::OCompoundProperty abc_schema_prop_for_custom_props(T abc_schema) + { + return abc_schema.getUserProperties(); + } }; } // namespace blender::io::alembic |