Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/io/alembic/exporter/abc_writer_abstract.h')
-rw-r--r--source/blender/io/alembic/exporter/abc_writer_abstract.h41
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